4

オブジェクトが与えられた場合、クラスがシングルトンであるかどうかをどのように確認しますか?

現在私はこれを使用しています

public class SingletonClass implements IsSingleton

ここで、IsSingletonはシングルトンクラスに実装する空白のインターフェイスです。したがって、クラスはシングルトンとしてテストできます

SingletonClass obj = SingletonClass.getInstance();
if(obj instanceof IsSingleton)
    System.out.println("Class is Singleton");
else
    System.err.println("Class not singleton");

シングルトンクラスを決定するためのより良い方法はありますか?私は自分の道を試しましreflectionたが、問題は宣言されたパブリッククラスgetConstructors()のみを返すことです。したがって、コンストラクターが宣言されていないクラスはシングルトンとして扱われます。

4

5 に答える 5

5

シングルトンはセマンティック定義であり、これは一般的にコードを介してテスト可能ではありません。インターフェイスやその他のスキームでは、クラスがシングルトンとしてのみ動作することを保証できません。

このため(セマンティックな性質)、この機能を示すカスタムアノテーションを作成する方がIMOの方が適しています。

于 2012-05-18T16:50:00.107 に答える
5

これはあなたに役立つかもしれないと思います....メモリ内にオブジェクトが作成されるときはいつでも、それに関連付けられたハッシュコードが常にあります。このハッシュコードは、メモリ割り当てアドレスの開始など、いくつかのパラメータを使用した数学演算によって計算されます。したがって、任意のオブジェクトでhashcode()を何度も呼び出すと、同じハッシュコードが返されます。したがって、期待されるシングルトンタイプのオブジェクトを返すメソッドを呼び出し、hashcode()メソッドを呼び出すだけです。毎回同じハッシュコードを出力する場合、それはシングルトンであることを意味し、そうでない場合はそうではありません。

多くの人が、instanceofキーワードは、オブジェクトがシングルトンであるかどうかを判断するのに役立つと言っています。しかし、私はこれがどのように可能であるかを本当に理解していませんか?instanceofを使用すると、インスタンスが特定のクラスに属しているかどうかを調べることができます。したがって、クラスAのインスタンスが複数あり、それらがシングルトンパターンで作成されていない場合、それらのいずれかについてinstanceofをチェックすると、常にtrueが返されます。ただし、メモリ内のオブジェクトごとに個別のインスタンスが存在するため、シングルトンとして呼び出すことはできません。

于 2012-05-18T19:41:05.483 に答える
2

クラスがシングルトンであるかどうかをプログラムで知る一般的な方法はありません。

于 2012-05-18T16:45:09.473 に答える
1

instanceofはインターフェースで動作するはずです。

SingletonClass obj = SingletonClass.getInstance();

if (obj instanceof IsSingleton)
    System.out.println("Yay !");

ただし、注意してください。

http://www.xyzws.com/Javafaq/how-does-instanceof-work-with-interface/67

オブジェクトがStringなどの最終クラスからのものである場合、これは機能しません。カスタムクラスの場合、クラス自体を最終的なものにしない限り、問題はありません。

于 2012-05-18T16:46:57.193 に答える
0

これは非常に複雑に見えます。

Javaは「instanceof」をサポートします

SingletonClass obj = SingletonClass.getInstance();
if(obj instanceof IsSingleton)
    System.out.println("Class is Singleton");
else
    System.err.println("Class not singleton");
于 2012-05-18T16:45:01.090 に答える