HOWTO · Java

Java のフレンド クラス

このチュートリアルでは、Java でフレンド クラスを作成する方法を示します。

このページの内容

フレンド クラスは、クラスの非パブリック メンバーにアクセスするために使用される C++ の機能です。 Java は friend キーワードをサポートしていませんが、機能を実現できます。

このチュートリアルでは、Java でフレンド クラスを作成する方法を示します。

Java のフレンド クラス

フレンドの概念は、Java でも実装できます。 たとえば、会社の異なる部門に所属する 2 人の同僚です。

両方の同僚はお互いを知りませんが、仕事のために協力する必要があります。 友人のパターンに基づいて、1 人の従業員を Jack として、もう 1 人を Michelle として設定します。

この例を実装するには、2つのパッケージを作成し、両方のクラスを実装する必要があります。

Department(package) Delftstack1 のクラス Jack:

package Delftstack1;

import Delftstack2.Michelle;

public final class Jack {
  static {
    // Declare classes in the Delftstack2 package as 'friends'
    Michelle.setInstance(new Michelle_Implement());
  }

  // Constructor is Only accessible by 'friend' classes.
  Jack() {}

  // This Method is Only accessible by 'friend' classes.
  void HelloDelftstack() {
    System.out.println("Hello! I am Jack from Delftstack");
  }

  static final class Michelle_Implement extends Michelle {
    protected Jack createJack() {
      return new Jack();
    }

    protected void sayHello(Jack jack) {
      jack.HelloDelftstack();
    }
  }
}

Department(package) Delftstack2 のクラス Michelle:

package Delftstack2;

import Delftstack1.Jack;

public abstract class Michelle {
  private static Michelle instance;

  static Michelle getInstance() {
    Michelle a = instance;
    if (a != null) {
      return a;
    }

    return createInstance();
  }

  private static Michelle createInstance() {
    try {
      Class.forName(Jack.class.getName(), true, Jack.class.getClassLoader());
    } catch (ClassNotFoundException e) {
      throw new IllegalStateException(e);
    }

    return instance;
  }

  public static void setInstance(Michelle michelle) {
    if (instance != null) {
      throw new IllegalStateException("Michelle instance already set");
    }

    instance = michelle;
  }

  protected abstract Jack createJack();

  protected abstract void sayHello(Jack jack);
}

main メソッドを実装するクラス:

package Delftstack2;

import Delftstack1.Jack;

public final class Friend_Class {
  public static void main(String[] args) {
    Michelle michelle = Michelle.getInstance();
    Jack jack = michelle.createJack();
    michelle.sayHello(jack);
  }
}

上記のコードは、Java でフレンド クラス機能を実装し、2つのクラスが異なるパッケージに含まれています。 クラス Michelle は、クラス Jack メンバーにアクセスするフレンド クラスとして機能します。

出力:

Hello! I am Jack from Delftstack