En Java, las variables privadas son visibles para toda la clase. Se puede acceder desde métodos estáticos y desde otras instancias de la misma clase.
Esto es, por ejemplo, útil en los métodos de fábrica . Un método de fábrica generalmente inicializa un objeto que es tan complejo que no desea dejarlo en el código de la aplicación. Para realizar la inicialización, el método de fábrica a menudo necesita acceso a los elementos internos de clase que no desea exponer. Ser capaz de acceder a las variables privadas directamente hace que su vida sea mucho más fácil.
Sin embargo, cuando desea ocultar los detalles de implementación de una clase incluso de métodos estáticos o de otras instancias de esa clase, puede seguir el patrón de datos de la clase privada . Coloque todas las variables privadas de una clase en una clase interna privada y delegue cualquier getters o setters a getters y setters de esa clase interna.
Otra opción es definir una interfaz para la clase que declare todos los métodos públicos de la clase y luego solo haga referencia a la clase bajo esa interfaz siempre que sea posible. Una referencia al tipo de interfaz no se puede utilizar para acceder directamente a nada no declarado en la interfaz, sin importar dónde (excepto con reflexión, por supuesto). Cuando utiliza un lenguaje de programación orientado a objetos que no tiene interfaces (como C ++, por ejemplo), se pueden simular con una clase base abstracta que la clase real hereda.
interface ITest {
public int getA();
}
class Test implements ITest {
private int a = 5;
public int getA() { return a; } // implementation of method declared in interface
public static void main(){
ITest t = new Test();
t.a = 1; // syntax error: Interface ITest has no "a"
System.out.println(t.getA()); // calls Test.getA, visible because ITest declares it
}
}
equals
que tiene que verificar los campos privados de otra instancia. (Publicación como comentario, ya que es breve, y nada sobre la OOP-ness de este enfoque)