Java「プライベート」アクセス修飾子

1. 概要

Javaプログラミング言語では、フィールド、コンストラクター、メソッド、およびクラスをlink:/java-access-modifiers[access modifiers]でマークできます。 このチュートリアルでは、Javaの_private_アクセス修飾子について説明します。

2.  キーワード

_private_アクセス修飾子は、オブジェクト指向プログラミングのコア原則であるカプセル化と情報の隠蔽を可能にするため重要です。 カプセル化はメソッドとデータをバンドルする役割を果たしますが、情報の隠蔽はカプセル化の結果であり、オブジェクトの内部表現を隠します。
最初に覚えておくべきことは、_private_として宣言された要素は、それらが宣言されているクラスによってのみアクセスできるということです*。

3. フィールド

これから、主題をよりよく理解するための簡単なコード例をいくつか見ていきます。
最初に、いくつかの_private_インスタンス変数を含む_Employee_クラスを作成しましょう。
public class Employee {
    private String privateId;
    private boolean manager;
    //...
}
この例では、ID生成にロジックを追加するため、_privateId_変数を_private_としてマークしました。 そして、ご覧のとおり、このフィールドの直接変更を許可しないため、_manager_属性で同じことを行いました。

4. コンストラクタ

_private_コンストラクターを作成しましょう。
private Employee(String id, String name, boolean managerAttribute) {
    this.name = name;
    this.privateId = id + "_ID-MANAGER";
}
コンストラクタを_private_としてマークすると、クラス内からのみ使用できます。
  • _Employee_クラスの外部からこの_private_コンストラクタを使用する唯一の方法となる_static_メソッドを追加しましょう:*

public static Employee buildManager(String id, String name) {
    return new Employee(id, name, true);
}
これで、次のように記述するだけで、_Employee_クラスのマネージャーインスタンスを取得できます。
Employee manager = Employee.buildManager("123MAN","Bob");
そしてもちろん、_buildManager_メソッドは_private_コンストラクターを呼び出します。

5. 方法

クラスに_private_メソッドを追加しましょう:
private void setManager(boolean manager) {
    this.manager = manager;
}
そして、何らかの理由で、「Carl」という名前の従業員のみがマネージャーに昇進できるという会社のarbitrary意的なルールがありますが、他のクラスはこれを認識していません。 _private_メソッドを呼び出すこのルールを処理するロジックを持つ_public_メソッドを作成します。
public void elevateToManager() {
    if ("Carl".equals(this.name)) {
        setManager(true);
    }
}

6. _private_アクション中

_Employee_クラスを外部から使用する方法の例を見てみましょう。
public class ExampleClass {

    public static void main(String[] args) {
        Employee employee = new Employee("Bob","ABC123");
        employee.setPrivateId("BCD234");
        System.out.println(employee.getPrivateId());
    }
}
_ExampleClass_を実行すると、コンソールに出力が表示されます。
BCD234_ID
この例では、_private_変数_privateId_に直接アクセスできないため、_public_コンストラクターと_public_メソッド_changeId(customId)_を使用しました。
_Employee_クラスの外部から_private_メソッド、コンストラクタ、または変数*にアクセスしようとするとどうなるか見てみましょう。
public class ExampleClass {

    public static void main(String[] args) {
        Employee employee = new Employee("Bob","ABC123",true);
        employee.setManager(true);
        employee.privateId = "ABC234";
    }
}
*違法なステートメントごとにコンパイルエラーが発生します:
The constructor Employee(String, String, boolean) is not visible
The method setManager(boolean) from the type Employee is not visible
The field Employee.privateId is not visible

7. クラス

_private_クラスを作成できる特別なケースが1つあります—他のクラスの内部クラスとして。 それ以外の場合、外部クラスを_private_として宣言すると、他のクラスにアクセスできなくなり、役に立たなくなります。
public class PublicOuterClass {

    public PrivateInnerClass getInnerClassInstance() {
        PrivateInnerClass myPrivateClassInstance = this.new PrivateInnerClass();
        myPrivateClassInstance.id = "ID1";
        myPrivateClassInstance.name = "Bob";
        return myPrivateClassInstance;
    }

    private class PrivateInnerClass {
        public String name;
        public String id;
    }
}
この例では、_private_アクセス修飾子を指定して、__ PublicOuterClass ___内に_private_内部クラスを作成しました。
_private_キーワードを使用したため、何らかの理由で_PublicOuterClass_ *の外部から_PrivateInnerClass_をインスタンス化しようとすると、コードはコンパイルされず、エラーが表示されます。
PrivateInnerClass cannot be resolved to a type

8. 結論

このクイックチュートリアルでは、Javaの_private_アクセス修飾子について説明しました。 カプセル化を達成するための良い方法であり、情報の隠蔽につながります。 その結果、必要なデータと動作のみを他のクラスに公開することができます。
いつものように、コード例はhttps://github.com/eugenp/tutorials/tree/master/core-java-modules/core-java-lang-oop-2[GitHubで]から入手できます。