Javaでは、プライベート変数はクラス全体に表示されます。静的メソッドおよび同じクラスの他のインスタンスからアクセスできます。
これは、たとえば、ファクトリメソッドで役立ちます。通常、ファクトリメソッドは、アプリケーションコードに任せたくないほど複雑なオブジェクトの初期化を行います。初期化を行うために、ファクトリメソッドは、公開したくないクラス内部にアクセスする必要があります。プライベート変数に直接アクセスできると、生活がずっと楽になります。
ただし、静的メソッドやそのクラスの他のインスタンスからでもクラスの実装の詳細を非表示にしたい場合は、プライベートクラスデータパターンに従うことができます。クラスのすべてのプライベート変数をプライベート内部クラスに入れ、ゲッターまたはセッターをその内部クラスのゲッターおよびセッターに委任します。
別のオプションは、クラスのすべてのパブリックメソッドを宣言するクラスのインターフェイスを定義し、そのインターフェイスの下で可能な限りクラスを参照することです。interface-typeへの参照を使用して、インターフェイスで宣言されていないものに直接アクセスすることはできません(どこでも(もちろん、リフレクションを除く)。インターフェイスを持たないオブジェクト指向プログラミング言語(C ++など)を使用する場合、実際のクラスによって継承される抽象ベースクラスを使用してシミュレートできます。
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
、別のインスタンスのプライベートフィールドをチェックする必要があることです。(これは短いため、コメントとして投稿します。このアプローチのOOP性については何もありません)