¿Por qué no debería usar variables públicas en mi clase de Java? [duplicar]

12

En la escuela, me han dicho muchas veces que deje de usar public para mis variables. No he preguntado por qué todavía.

Esta pregunta: ¿Los campos públicos de Java son solo un defecto de diseño histórico trágico en este punto? parece estar relacionado con esto. Sin embargo, parece que no discuten por qué está "mal", sino que se centran en cómo pueden usarlos en su lugar.

Mira esta clase (sin terminar):

public class Reporte {

    public String rutaOriginal;
    public String rutaNueva;
    public int bytesOriginales;
    public int bytesFinales;
    public float ganancia;

    /**
     * Constructor para objetos de la clase Reporte
     */
    public Reporte() {

    }
}

No hay necesidad de entender el español. Todo lo que hace esta clase es mantener algunas estadísticas (esos campos públicos) y luego hacer algunas operaciones con ellos (más adelante).

También necesitaré modificar esas variables a menudo. Pero bueno, ya que me han dicho que no use public , esto es lo que terminé haciendo:

public class Reporte {

    private String rutaOriginal;
    private String rutaNueva;
    private int bytesOriginales;
    private int bytesFinales;
    private float ganancia;

    /**
     * Constructor para objetos de la clase Reporte
     */
    public Reporte() {

    }

    public String getRutaOriginal() {
        return rutaOriginal;
    }

    public String getRutaNueva() {
        return rutaNueva;
    }

    public int getBytesOriginales() {
        return bytesOriginales;
    }

    public int getBytesFinales() {
        return bytesFinales;
    }

    public float getGanancia() {
        return ganancia;
    }

    public void setRutaOriginal(String rutaOriginal) {
        this.rutaOriginal = rutaOriginal;
    }

    public void setRutaNueva(String rutaNueva) {
        this.rutaNueva = rutaNueva;
    }

    public void setBytesOriginales(int bytesOriginales) {
        this.bytesOriginales = bytesOriginales;
    }

    public void setBytesFinales(int bytesFinales) {
        this.bytesFinales = bytesFinales;
    }

    public void setGanancia(float ganancia) {
        this.ganancia = ganancia;
    }
}

Parece un poco bonito. Pero parece una pérdida de tiempo.

Las búsquedas de Google sobre "Cuándo usar el público en Java" y "¿Por qué no debería usar el público en Java" parecen discutir sobre un concepto de mutabilidad , aunque no estoy realmente seguro de cómo interpretar tales discusiones. Quiero que mi clase sea mutable, todo el tiempo.

    
pregunta Omega 23.11.2012 - 02:03

2 respuestas

24

Rompe la encapsulación: el principio básico aquí es que los campos de su clase son detalles de implementación, al exponerlos como un campo público, le están diciendo a todo lo que está fuera de esa clase que es un dato real almacenado por el clase - algo que las clases externas no necesitan saber, solo necesitan poder obtener o configurar esa información. Tan pronto como haga algo público, las clases externas deberían poder depender de él, y no debería cambiar a menudo, al implementar como método, está reteniendo la flexibilidad de cambiar la implementación en un momento posterior sin afectar a los usuarios de la clase. .

Si desea cambiar uno de los campos para que se calcule o se recupere de un servicio cuando se le llame, no podrá hacerlo sin romper otras partes de su aplicación. Otras razones son que le permite controlar el acceso a la variable (es decir, hacerla inmutable como ya ha resaltado). En los configuradores, también puede agregar el código de verificación, y puede agregar comportamientos a los captadores y establecedores que hacen otras cosas cuando se obtiene o establece una variable (aunque esto no siempre es bueno). También puede anular un método en una clase derivada, no puede anular un campo.

Hay algunas situaciones muy raras en las que es mejor tener un campo público en lugar de un método, pero esto solo se aplica en aplicaciones de muy alto rendimiento (juegos 3D y aplicaciones de comercio financiero), a menos que está escribiendo uno de estos, evite los campos públicos, y si le importa el rendimiento a ese nivel, probablemente, de todos modos, Java no sea la mejor opción.

Solo una nota sobre la mutabilidad: en general, debe tratar de hacer que las cosas sean inmutables hasta que tenga una razón genuina para hacerlas mutables: cuanto menos se exponga su código en su API pública, más fácil será para el mantenimiento a largo plazo. En una situación de subprocesos múltiples, los objetos inmutables son seguros para subprocesos, los objetos mutables deben implementar el bloqueo.

    
respondido por el Brian Flynn 23.11.2012 - 02:39
8

Encapsulación es uno de los cuatro conceptos fundamentales de la POO. Los otros tres son herencia, polimorfismo y abstracción.

La encapsulación es la técnica de hacer que los campos de una clase sean privados y proporcionar acceso a los campos a través de métodos públicos. Si un campo se declara privado, no puede acceder a él nadie que esté fuera de la clase, ocultando así los campos dentro de la clase. Por este motivo, la encapsulación también se conoce como ocultación de datos.

La encapsulación se puede describir como una barrera protectora que impide que el código y los datos sean accedidos aleatoriamente por otro código definido fuera de la clase. El acceso a los datos y al código está controlado estrechamente por una interfaz.

El principal beneficio de la encapsulación es la capacidad de modificar nuestro código implementado sin romper el código de otros que usan nuestro código. Con esta característica, la encapsulación proporciona mantenibilidad, flexibilidad y extensibilidad a nuestro código. Beneficios de la encapsulación:

Los campos de una clase pueden ser de solo lectura o de solo escritura.

Una clase puede tener control total sobre lo que se almacena en sus campos.

Los usuarios de una clase no saben cómo la clase almacena sus datos. Una clase puede cambiar el tipo de datos de un campo, y los usuarios de la clase no necesitan cambiar ninguno de sus códigos. Los métodos públicos son los puntos de acceso a los campos de esta clase desde el mundo exterior de Java. Normalmente estos métodos se denominan captadores y definidores. Por lo tanto, cualquier clase que quiera acceder a las variables debe acceder a ellas a través de estos captadores y definidores.

    
respondido por el Nikunj Sanghadia 23.11.2012 - 08:29

Lea otras preguntas en las etiquetas