2010-11-23 8 views
2


deleteObjectメソッドでdogオブジェクトを削除したいなど、他の方法でオブジェクトを削除するにはどうしたらいいですか?オブジェクトへの現在の参照が削除されます。 解決方法はありますか?Javaの他のメソッドでオブジェクトを削除するにはどうしたらいいですか?

public class Main { 
    public static void main(String[] args) { 
     Dog dog = new Dog("Max"); 
     deleteObject(dog); 
     System.out.println(dog.toString()); //it still exists! I want to remove it 
    } 

    public static void deleteObject(Dog dog) { 
      dog = null; //I want to remove this object but it deletes just this method's reference 
    } 
} 

class Dog { 
    private String name; 

    public Dog(String name) { 
     this.name=name; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 
} 
+0

犬をグローバル変数にしても問題ありません。しかし、オブジェクトの使い方が必要な場合は、シングルトンパターンを使用することをお勧めします。 – zengr

+0

「削除」とはどういう意味ですか? - 記憶を解放する? – Ralph

+0

グローバルは静的変数ですか?私は静的な犬の犬を試みる場合;それはまだ動作していません。私はsignletoneパターンを使用しようとしましたが、私のアプリではマルチスレッドを使用しているためベストの決定ではありません – gennad

答えて

2

Javaオブジェクトでは、GCによるガベージコレクション(削除された単語)は、そのオブジェクトに対するアクティブな参照が存在しない場合、自動化された処理です。さらに、参照が存在しない場合、それがただの要求を削除されていることを100%確実にすることはできません。

+1

@gennad:指定されていない参照を残してガベージコレクタは@ org.life.javaが述べている。 –

0
public class Main { 
    static Dog dog = null; 
    public static void main(String[] args) { 

     dog = new Dog("Max"); 
     dog = deleteObject(dog); //really unnecessary 

     if(dog==null) 
     { 
      System.out.println("I AM DEAD!"); 
     } 
     else 
     { 
      System.out.println(dog.toString()); 
     } 
    } 

    public static Dog deleteObject(Dog dog) { 
     dog = null; 

     return dog; 
    } 
} 


class Dog { 
    private String name; 

    public Dog(String name) { 
     this.name=name; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 
} 
+0

しかし、より良いオブジェクト管理のためにシングルトンを使用してください – zengr

+0

静的メソッドのクラス変数にアクセスできません – gennad

+0

静的変数を使用できますが、2つの参照もあります – gennad

2

オブジェクトがそれ以上参照されていない場合、オブジェクトは「削除」されます(または、具体的にはガベージコレクタによる削除の対象となります)。あなたの例では、2つの参照が同じオブジェクトを指しています(メインメソッドのdog参照とdeleteObjectメソッドのdog参照)。 deleteObjectでdogをnullに設定すると、mainのdog参照はまだオブジェクトを指しています。

メインでnullへのドッグリファレンスを設定するだけで、オブジェクトがガベージコレクションの対象にならないようにすることができます。または、犬の参照をクラス変数、つまり任意のメソッドの外で宣言するようにします。そして、mainとdelteObjectは同じ犬参照で動作します。

どうしてこのオブジェクトを削除したいですか?メソッドの終わりには、すべてのローカル参照がスコープ外になり、オブジェクトはガベージコレクションの対象になりません。

1

私は解決策を持っていますが、おそらくあなたの問題には余りにも不十分です。それは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を常にクリーニングする方法が必要です。

あなたが実際にやろうとしていることによると、これは多すぎるかもしれませんし、別の解決法を使う方がいいかもしれませんし、完全に忘れているかもしれませんが、少なくともこれが働くと思います。

関連する問題