Em Java, variáveis privadas são visíveis para toda a classe. Eles podem ser acessados a partir de métodos estáticos e de outras instâncias da mesma classe.
Isso é, por exemplo, útil em métodos de fábrica . Um método de fábrica geralmente inicializa um objeto que é tão complexo que você não deseja deixá-lo no código do aplicativo. Para fazer a inicialização, o método factory geralmente precisa acessar os internos da classe que você não deseja expor. Ser capaz de acessar diretamente as variáveis privadas facilita sua vida.
No entanto, quando você deseja ocultar os detalhes de implementação de uma classe, mesmo de métodos estáticos ou de outras instâncias dessa classe, pode seguir o padrão de dados da classe privada . Coloque todas as variáveis privadas de uma classe em uma classe interna privada e delegue quaisquer getters ou setters a getters e setters dessa classe interna.
Outra opção é definir uma interface para a classe que declare todos os métodos públicos da classe e, em seguida, referencie a classe sob essa interface sempre que possível. Uma referência ao tipo de interface não pode ser usada para acessar diretamente qualquer coisa não declarada na interface, não importa onde (exceto com reflexão, é claro). Quando você usa uma linguagem de programação orientada a objetos que não possui interfaces (como C ++, por exemplo), elas podem ser simuladas com uma classe base abstrata que é herdada pela classe real.
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 é necessário verificar os campos particulares de outra instância. (Posting como comentário, como este é curto, e nada sobre a OOP-ness desta abordagem)