No utilizar public
campos
No use public
campos cuando realmente quiera ajustar el comportamiento interno de una clase. Toma java.io.BufferedReader
por ejemplo. Tiene el siguiente campo:
private boolean skipLF = false; // If the next character is a line feed, skip it
skipLF
se 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 skipLF
en medio de una lectura? BufferedReader
Definitivamente se volverá loco.
Usa public
campos
Tome esta Point
clase 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 struct
lugar 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 Point
clase anterior deben ser inmutables, puede agregar una final
palabra clave para aplicarla:
public final double x;
public final double y;