2017-04-19 7 views
0

SingletonインスタンスはClassLoaderごとに作成されます。 Singletonとは異なり、ClassLoaderは、そのクラスのオブジェクト作成が発生したときはいつでも、そのクラスがSingletonでない場合、別のオブジェクトを作成します。セッションごとに複数オブジェクト対シングルトンオブジェクト

私の質問は:ありますかそこに'n'セッションあたりのクラスのオブジェクト数?

+0

「セッション」とは何ですか? –

+0

ClassLoadersはオブジェクトのインスタンス化やクラスの初期化を処理しません。彼らが行うのは、クラスをロードしてリソースへのアクセスを提供することだけです。また、「シングルトン」はJavaによって本質的に認識されるクラスの特徴でもありません。むしろ、いくつかのクラスの実装の特徴です。 –

+0

本当に知りたいことは何ですか?非シングルトンクラスのインスタンスが複数あるかどうかその答えは、はっきりしているはずですよね? –

答えて

1

ヒープメモリの割り当てを伴うそれぞれそのうちの一つは、クラスのインスタンスを「使用」することができます前に発生する必要がある三つのこと、あります

は、クラスのバイトコードがロードされ、いずれかを解決するためにリンクする必要があります他のクラスへの静的な依存関係 クラスを初期化する必要があります。 クラスのインスタンスを作成する必要があります。 通常、クラスのロードとリンクは、JVMを開始するときに発生しますが、JVMによって「遅れて」実行され、動的に実行される可能性があります。例えばClass.forName(...)を使用します。これは、クラス "コード"のメモリが割り当てられているときです。

通常、クラスの初期化は、実際にクラスが実際に使用される直前に行われます。 (詳細はJLSに記載されています)。これは、クラススタティックのメモリが割り当てられるときです。

新しい構成が使用されると、クラスの作成が行われます。これにより、まだ初期化されていないクラスのクラス初期化がトリガーされます。これは、インスタンスのメモリが割り当てられている場合です

0

はい、セッションスコープに2つの非シングルトンクラスのオブジェクトを持つことができます。

0

あなたのセッションにクラスのn個のインスタンスがあり、そうでないことを保証する場合は、そのような動作を実装するのはあなた次第です。シングルトンと同じ。 Javaでは、シングルトンパターンの実装を保証するメカニズムは提供されていません。それはプログラマーか、それを行うことができるフレームワークです。したがって、クラスのインスタンスをあらかじめ定義しておきたい場合は、それがあなたの責任です。ここで最も簡単な考え方は次のとおりです。

 public class MyTest { 
      private static List<MyTest> instances = new ArrayList<>(5); 
      static { 
       for(int i = 0; i < 5; i++) { 
        instances.add(new MyTest()); 
       } 
      } 

      public static MyTest getInstance() { 
       return instances.get(3 /*or whatever logic to determine which one/*); 
      } 

     ... 
     } 
関連する問題