いいえを制限したいです。クラスの直接インスタンス(Javaの場合)のnは、nと言います。つまり、いつでも、クラスのn個以下の直接オブジェクトがメモリに存在します。しかし、そのような制限はありません。このクラスのサブクラスなどの間接オブジェクトの。Javaでこれを実現する方法はありますか?
4 に答える
ファクトリデザインパターンを使用し、インスタンスが制限を超えた場合は例外をスローします。
http://www.oodesign.com/factory-pattern.html
以下は、大まかなサンプル実装です。
public class AnyClass {
private static final int limit_ = 8;
private static int count = 0;
private AnyClass() {}
public static synchronized AnyClass getInstance() {
if (count < limit_) {
AnyClass anyClass = new AnyClass();
count++;
return anyClass;
}
return null;
}
}
これを行うのは悪い考えだと思います(ユースケースがわからない)が、とにかく...
そのクラスのコンストラクターにコードを入れることで、すべてのインスタンスを数えることができます。サブクラスのインスタンスを無視する必要がある場合は、によって返される値を確認してくださいgetClass()
。
インスタンスがいつリリースされるかを知るには、弱参照とWeakHashMapを使用して、まだ使用されているインスタンスの数の見積もりを取得できます。ガベージコレクションは予測できない時間にインスタンスを削除するため、実際に使用されているインスタンスの数は少なくなる可能性があります。正確な数については、インスタンスが使用されなくなることがわかっているときに、何らかのメソッドを明示的に呼び出す必要があります。
できるよ:
static final AtomicInteger count = new AtomicInteger();
// in your parent constructor.
if (getClass() == Parent.class && count.incrementAndGet() >= LIMIT)
throw new IllegalStateException();
Javaはこの可能性をネイティブに提供しません。
プールされたFactoryを使用するか、クラスコンストラクターで直接ケースを管理できると思います。コンストラクターでは、静的カウンターINSTANCES(クラスでプライベート数値として定義されている)をチェックし、INSTANCES> MAX_LIMITの場合、例外をスローします。