Java は C の 'フレンド' 概念をエミュレートできますか?
C では、'フレンド' 概念により、さまざまなパッケージのクラスがアクセスできるようになります。他のクラスのプライベートメソッドと保護されたメソッド。 Java には、この機能に直接相当する機能はありません。ただし、賢い回避策を使用すると、「フレンド」の概念をシミュレートできます。
Java で「フレンド」をシミュレートする方法
この回避策の鍵は、クラスレベルの秘密の識別子。異なるパッケージからの 2 つのクラス、ロミオとジュリエットがあると想像してみましょう。 Romeo は、クラスを拡張せずに Juliet の非パブリック メソッドにアクセスしたいと考えています。
Romeo のパッケージ内:
public class Romeo { public static final class LoveIdentifier { private LoveIdentifier() {} } private static final LoveIdentifier loveIdentifier = new LoveIdentifier(); public void cuddleJuliet(Juliet.LoveIdentifier loveIdentifier) { // ... } }
Romeo は、プライベート コンストラクターを使用してネストされた静的クラス LoveIdentifier を定義します。このクラスは、Romeo が Juliet のプライベート メソッドにアクセスできるようにする秘密識別子として機能します。
Juliet のパッケージ内:
public class Juliet { public static final class LoveIdentifier { private LoveIdentifier() {} } private static final LoveIdentifier loveIdentifier = new LoveIdentifier(); public void beCuddled(Romeo.LoveIdentifier loveIdentifier) { // Allow Romeo to access private methods using the identifier } }
Juliet は、Romeo のものと一致する同一の LoveIdentifier クラスも定義します。 Juliet の beCuddled メソッドが呼び出されると、渡された LoveIdentifier が彼女のものと一致するかどうかがチェックされます。許可されている場合、ロミオにそのプライベート メソッドへのアクセスが許可されます。
「友達」シミュレーションの使用
これで、ロミオは共有 LoveIdentifier を次のように提供することでジュリエットと対話できるようになります。引数:
Romeo romeo = new Romeo(); Juliet juliet = new Juliet(); romeo.cuddleJuliet(juliet.loveIdentifier);
ロミオは正しい LoveIdentifier を渡しているため、ジュリエットのプライベート メソッドにアクセスでき、C の「友達」関係を効果的にシミュレートできます。
以上がJava は C の「フレンド」概念を模倣できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。