私は解決策を持っていますが、おそらくあなたの問題には余りにも不十分です。それはWeakReferencesが含まれます。ここ
public class Pound{
public static WeakReference<Dog> adopt(String name){
Dog newDog = new Dog(name);
dogList.add(newDog);
return new WeakReference<Dog>(newDog);
}
public static void sacrifice(WeakReference<Dog> dogRef){
Dog sadPuppy = dogRef.get();
dogList.remove(sadPuppy);
}
private static List<Dog> dogList = new ArrayList<Dog>();
public class Dog{
public String getName(){
return this.name;
}
private Dog(String name){
this.name = name;
}
private String name;
}
}
トリックは犬のインスタンスにのみ強い参照がポンドクラスである(またはメソッドへのローカル参照で)ことを確認し、他の場所WeakReferencesを使用することです。あなたはどこでもあなたのコード内からメソッド
sacrifice(WeakReference<Dog> dog)
を呼び出すときにその方法は、あなたは、GCのため、それはelligible作り、それだけに強い参照を削除することがあります。だから、あなたは任意の方法から犬のインスタンスを処分する場合:
class Main{
public static void main(String ... args){
WeakReference<Dog> max = Pound.adopt("Max");
//This line prints "Max"
System.out.println(max.get().getName());
meanMethod(max);
//Max is now dead, so you get a NullPointerException
System.out.println(max.get.getName());
}
public static void meanMethod(WeakReference<Dog> dog){
Pound.sacrifice(dog);
//From this point, dog is no more ='(
}
}
あなたは一つの方法では、犬のインスタンスを作成し、中に(あなたが唯一つの永久強い参照を持っている限り、他でそれらを処分することができます
犬がどこに格納されているかを示すリスト)を作成し、それらをリストに追加したり削除したりするメソッドを提供します。もちろん、あなたがそうするなら、これはすべて役に立ちません:
Dog strongDog = weakReferenceToDog.get();
あなたの主な方法では。
また、ヌル値にget()を使用するコードのすべての部分をチェックする必要があります。デッドWeakReferencesを保持するReferenceQueueを常にクリーニングする方法が必要です。
あなたが実際にやろうとしていることによると、これは多すぎるかもしれませんし、別の解決法を使う方がいいかもしれませんし、完全に忘れているかもしれませんが、少なくともこれが働くと思います。
犬をグローバル変数にしても問題ありません。しかし、オブジェクトの使い方が必要な場合は、シングルトンパターンを使用することをお勧めします。 – zengr
「削除」とはどういう意味ですか? - 記憶を解放する? – Ralph
グローバルは静的変数ですか?私は静的な犬の犬を試みる場合;それはまだ動作していません。私はsignletoneパターンを使用しようとしましたが、私のアプリではマルチスレッドを使用しているためベストの決定ではありません – gennad