1. 概要

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

2. キーワード

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;
}

そして、どういうわけか、他のクラスは気づいていないのに、「カール」という名前の従業員だけがマネージャーに昇進できるという恣意的なルールがあるとしましょう。 private メソッドを呼び出すこのルールを処理するロジックを使用して、publicメソッドを作成します。

public void elevateToManager() {
    if ("Carl".equals(this.name)) {
        setManager(true);
    }
}

6. private in Action

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 変数にアクセスできないため、 publicコンストラクターとpublicメソッドchangeId(customId)を使用しました。 privateId直接。

Employee クラスの外部からプライベートメソッド、コンストラクター、または変数にアクセスしようとすると、がどうなるか見てみましょう。

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. クラス

プライベートクラスを作成できる特別なケースが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 access修飾子を指定して、PublicOuterClass内にprivate内部クラスを作成しました。

private キーワードを使用したため、何らかの理由で PublicOuterClass の外部からPrivateInnerClassをインスタンス化しようとすると、コードがコンパイルされず、エラーが表示されます。

PrivateInnerClass cannot be resolved to a type

8. 結論

このクイックチュートリアルでは、Javaのprivateアクセス修飾子について説明しました。 これは、情報の隠蔽につながるカプセル化を実現するための良い方法です。 その結果、必要なデータと動作のみを他のクラスに公開することができます。

いつものように、コード例はGitHubから入手できます。