[解決済み】C++の「友達」コンセプトをJavaでシミュレートする方法はありますか?
2022-04-06 23:09:35
質問
あるパッケージのJavaクラスが、他のパッケージのクラスの非公開メソッドにアクセスできるようにしたいのですが、そのクラスを他のクラスのサブクラスとする必要があります。これは可能ですか?
どのように解決するのですか?
フレンド」という概念は、JavaではAPIとその実装を分離する場合などに便利です。実装クラスがAPIクラス内部へのアクセスを必要とすることはよくありますが、これらはAPIクライアントには公開されるべきではありません。これは、以下に説明する「フレンドアクセサ」パターンを使うことで実現できる。
APIを通じて公開されるクラス。
package api;
public final class Exposed {
static {
// Declare classes in the implementation package as 'friends'
Accessor.setInstance(new AccessorImpl());
}
// Only accessible by 'friend' classes.
Exposed() {
}
// Only accessible by 'friend' classes.
void sayHello() {
System.out.println("Hello");
}
static final class AccessorImpl extends Accessor {
protected Exposed createExposed() {
return new Exposed();
}
protected void sayHello(Exposed exposed) {
exposed.sayHello();
}
}
}
friend' 機能を提供するクラスです。
package impl;
public abstract class Accessor {
private static Accessor instance;
static Accessor getInstance() {
Accessor a = instance;
if (a != null) {
return a;
}
return createInstance();
}
private static Accessor createInstance() {
try {
Class.forName(Exposed.class.getName(), true,
Exposed.class.getClassLoader());
} catch (ClassNotFoundException e) {
throw new IllegalStateException(e);
}
return instance;
}
public static void setInstance(Accessor accessor) {
if (instance != null) {
throw new IllegalStateException(
"Accessor instance already set");
}
instance = accessor;
}
protected abstract Exposed createExposed();
protected abstract void sayHello(Exposed exposed);
}
friend'実装パッケージのクラスからのアクセス例です。
package impl;
public final class FriendlyAccessExample {
public static void main(String[] args) {
Accessor accessor = Accessor.getInstance();
Exposed exposed = accessor.createExposed();
accessor.sayHello(exposed);
}
}
関連
-
[解決済み] Maven: assembly-pluginが全く実行されない
-
[解決済み] Spring ApplicationContext - リソースリーク: 'context' が閉じられない
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Javaにおけるpublic、protected、package-private、privateの違いは何ですか?
-
[解決済み] Javaで文字列値からenum値を取得する方法
-
[解決済み] Java の配列を表示する最も簡単な方法は何ですか?
-
[解決済み] なぜ、オブジェクトそのものではなく、ポインタを使用しなければならないのですか?
-
[解決済み] Eclipseにプロジェクトをインポートした後に「Must Override a Superclass Method」エラーが発生する。
-
[解決済み] Javaにおける静的クラス
-
[解決済み】静的なMapを初期化する方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] java.sql.SQLException: ORA-00933: SQL コマンドが正しく終了していません。
-
[解決済み] getContentPane()は具体的に何をするのですか?
-
[解決済み] この配列の中の数字を入れ替えるには、何が足りないのでしょうか?ジャバ
-
[解決済み] java.lang.IncompatibleClassChangeError: Mongo クラスを実装しています。
-
[解決済み] 要素 'beans' の宣言が見つかりません。
-
[解決済み] javascriptでExpression言語を使うには?
-
[解決済み] javax.naming.NameNotFoundException
-
[解決済み] publicId と systemId の間に空白が必要です。
-
[解決済み] java.lang.ClassCastException: java.lang.Long を java.lang.Integer にキャストできない(java 1.6
-
[解決済み] Eclipseでクラスとそれに対応するファイルの名前を変更する方法は?