No utilizar publiccampos
No use publiccampos cuando realmente quiera ajustar el comportamiento interno de una clase. Toma java.io.BufferedReaderpor ejemplo. Tiene el siguiente campo:
private boolean skipLF = false; // If the next character is a line feed, skip it
skipLFse lee y se escribe en todos los métodos de lectura. ¿Qué sucede si una clase externa que se ejecuta en un hilo separado modifica maliciosamente el estado de skipLFen medio de una lectura? BufferedReaderDefinitivamente se volverá loco.
Usa publiccampos
Tome esta Pointclase por ejemplo:
class Point {
private double x;
private double y;
public Point(double x, double y) {
this.x = x;
this.y = y;
}
public double getX() {
return this.x;
}
public double getY() {
return this.y;
}
public void setX(double x) {
this.x = x;
}
public void setY(double y) {
this.y = y;
}
}
Esto haría que calcular la distancia entre dos puntos sea muy doloroso de escribir.
Point a = new Point(5.0, 4.0);
Point b = new Point(4.0, 9.0);
double distance = Math.sqrt(Math.pow(b.getX() - a.getX(), 2) + Math.pow(b.getY() - a.getY(), 2));
La clase no tiene ningún comportamiento que no sea getters y setters simples. Es aceptable usar campos públicos cuando la clase representa solo una estructura de datos, y no tiene, y nunca tendrá un comportamiento (los captadores y definidores delgados no se consideran comportamiento aquí). Se puede escribir mejor de esta manera:
class Point {
public double x;
public double y;
public Point(double x, double y) {
this.x = x;
this.y = y;
}
}
Point a = new Point(5.0, 4.0);
Point b = new Point(4.0, 9.0);
double distance = Math.sqrt(Math.pow(b.x - a.x, 2) + Math.pow(b.y - a.y, 2));
¡Limpiar!
Pero recuerde: no solo su clase debe estar ausente de comportamiento, sino que tampoco debe tener ninguna razón para tener un comportamiento en el futuro.
(Esto es exactamente lo que describe esta respuesta . Para citar "Convenciones de código para el lenguaje de programación Java: 10. Prácticas de programación" :
Un ejemplo de variables de instancia pública apropiadas es el caso donde la clase es esencialmente una estructura de datos, sin comportamiento. En otras palabras, si hubiera utilizado una en structlugar de una clase (si Java es compatible struct), entonces es apropiado hacer públicas las variables de instancia de la clase.
Entonces la documentación oficial también acepta esta práctica.)
Además, si está seguro de que los miembros de la Pointclase anterior deben ser inmutables, puede agregar una finalpalabra clave para aplicarla:
public final double x;
public final double y;