2010-11-23 52 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 2010-11-23 09:32:30

+0

你是什麼意思是「刪除」? - 釋放內存? – Ralph 2010-11-23 09:38:11

+0

全局是靜態變量?如果我嘗試靜態狗狗;它仍然沒有工作。我試圖使用signletone模式,但在我的應用程序中,它並不是最好的決定,因爲它使用多線程 – gennad 2010-11-23 09:39:53

回答

2

在Java對象是通過GC垃圾回收(在字中刪除)。當不存在有效的參考到該對象是自動化的過程。此外,你不能100%確定,當沒有裁判存在它已被刪除其正義請求。

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; 
    } 
} 
2

當沒有更多引用時,對象被「刪除」(或者更具體地說,有資格被垃圾收集器刪除)。在你的例子中有兩個引用指向同一個對象(你的主要方法中的狗引用和deleteObject方法中的狗引用)。當您在deleteObject中將狗設置爲null時,main中的狗引用仍然指向該對象。

您可以將主引用中的狗引用設置爲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。所以,如果你想從任何方法處置狗實例:

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。

根據你實際打算做的事情,這可能太多了,你會更好地用另一種解決方案,或完全忘記這一點,但至少這是我能想到的唯一辦法可以工作。

相關問題