In Java, le variabili private sono visibili all'intera classe. È possibile accedervi da metodi statici e da altre istanze della stessa classe.
Questo è, ad esempio, utile nei metodi di fabbrica . Un metodo factory solitamente esegue le inizializzazioni su un oggetto che sono così complesse da non volerle lasciare al codice dell'applicazione. Per eseguire l'inizializzazione, il metodo factory spesso ha bisogno di accedere agli interni della classe che non vuoi esporre. Essere in grado di accedere direttamente alle variabili private rende la vita molto più semplice.
Tuttavia, quando desideri nascondere i dettagli di implementazione di una classe anche da metodi statici o da altre istanze di quella classe, puoi seguire schema dati classe privata . Metti tutte le variabili private di una classe in una classe interna privata e delegate eventuali getter o setter a getter e setter di quella classe interna.
Un'altra opzione è quella di definire un'interfaccia per la classe che dichiara tutti i metodi pubblici della classe e quindi di fare riferimento alla classe sotto quell'interfaccia ogni volta che è possibile. Un riferimento al tipo di interfaccia non può essere utilizzato per accedere direttamente a qualsiasi cosa non dichiarata nell'interfaccia, indipendentemente da dove (tranne che con la riflessione, ovviamente). Quando usi un linguaggio di programmazione orientato agli oggetti che non ha interfacce (come C ++, per esempio), possono essere simulati con una classe base astratta che è ereditata dalla classe reale.
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
}
}