ホームページ >バックエンド開発 >C++ >Java はどのように C の Friend クラス機能を模倣できるのでしょうか?

Java はどのように C の Friend クラス機能を模倣できるのでしょうか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-24 16:53:22595ブラウズ

How Can Java Mimic C  's Friend Class Functionality?

Java での C 'friend' 概念の複製

C では、'friend' 概念により、異なるパッケージ内のクラスが非パブリックにアクセスできるようになります他のクラスのメンバー。 Java には直接同等のものはありませんが、ネストされたクラスを使用する賢い回避策が提供されます。

実装

異なるパッケージの 2 つのクラス、Romeo と Juliet について考えてみましょう。ロミオは、ジュリエットをサブクラス化せずに、ジュリエットの非パブリック メソッドにアクセスしたいと考えています。ネストされたクラスを使用してこれを実現する方法は次のとおりです。

// Juliet's package
public class Juliet {
    private void cuddle() {
        System.out.println("O Romeo, Romeo, wherefore art thou Romeo?");
    }
    
    // Signature security for cuddle
    public static class CuddleAllowed { private CuddleAllowed() {} }
    private static final CuddleAllowed cuddleAllowed = new CuddleAllowed();
    
    public void cuddle(Juliet.CuddleAllowed cuddle) {
        cuddle(); // Juliet can cuddle herself
        if (cuddle == cuddleAllowed) {
            System.out.println("Only Romeo can cuddle Juliet.");
        }
    }
}

// Romeo's package
public class Romeo {
    public static void cuddleJuliet() {
        Juliet juliet = new Juliet();
        juliet.cuddle(Juliet.cuddleAllowed); // Romeo can cuddle Juliet
    }
}

この例では:

  • Juliet.cuddleAllowed はプライベート コンストラクターを持つネストされたクラスです。 Juliet だけがインスタンスを作成できます。
  • Juliet.cuddle() はプライベートですが、内部的に、または Juliet.CuddleAllowed インスタンスからアクセスできます。
  • Romeo は、cuddleAllowed インスタンスを使用して cuddle() にアクセスします。ジュリエットは、ロミオによってインスタンスが提供された場合にのみ抱きしめられます。

以上がJava はどのように C の Friend クラス機能を模倣できるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。