2016-09-19 63 views
4

我有一種情況,當有人試圖從bList中刪除一個對象b時,我需要給出一條錯誤消息,並且它在某些其他類說的類A中使用。
如果b未在另一個類中引用,那麼我不應該拋出錯誤消息。對於上述方案檢查某個對象是否在使用java刪除它之前在某個地方使用過

public class A { 

    B b; 

    void setB(B b) { 
     this.b = b; 
    } 
} 

public class NotifyTest { 

    List<B> bList = new ArrayList<>(); 

    String notifyTest() { 

     A a = new A(); 
     B b = new B(); 
     a.setB(b); 
     bList.add(b); 

     if (b referencedSomewhere) 
     { 
      return "error"; 
     } 
     else 
     { 
      bList.remove(b); 
      return "success"; 
     } 
    } 
} 

我遍歷整個模型檢查對象b在某處使用

的僞碼打,所以我不想去這種做法性能。
請讓我知道,如果有任何Java提供的這種情況的解決方案或建議一個更好的方法來處理這個問題。

EDIT1:我需要一個錯誤消息時b比bList

+0

如何使用一個「b」? – 2016-09-19 05:25:56

+0

假設b沒有被引用到任何地方,bList.remove(b)有什麼意義?無論如何,它不能在bList中存在(如果bList沒有被引用)? – eis

+0

如果您從bList中刪除b,那麼也不會刪除b。它仍然留在記憶中。爲了執行你需要做的是在這種情況下將b賦值爲null。但是,這也不能確保b將被刪除 – Gaur93

回答

0

以外的任何其他地方被引用。如果是絕對不能使用的對象(或沒有太多的內存左)那麼Java將其標記爲刪除,然後當你開始使用你的內存,Java會自動爲你做垃圾回收。

大部分高級別都有垃圾回收(GC),如java,C#,Python(iirc)等。如果您使用更多低級語言(如C ir C++),則只需要關注內存實際上是低和高的水平)之間的某處

1

如果在這裏你的意圖是自動釋放從不再被引用列表項,你可以使用https://docs.oracle.com/javase/7/docs/api/java/util/WeakHashMap.html

你也可以用它來跟蹤所有按鍵那些還沒有收集垃圾。這可以爲您提供有關哪些項目已被垃圾收集(無法訪問後)的信息。但是,由於垃圾收集器可能會在任意時間運行,因此信息將不會實時。

+0

感謝您的回覆。我的意圖是顯示實時錯誤消息。我需要限制用戶在列表中除列表外的其他類中使用條目時,從列表中刪除條目 – Prabhu

1

我覺得像下面這樣的東西應該適合你。這很快就會展示給你看。它尚未經過測試,如果您希望它是線程安全的,則需要更多的工作。

class RefCounter<T> 
{ 
    private HashMap<T, Integer> counts = new HashMap<>(); 

    public T using(T object) 
    { 
     Integer num = counts.get(object); 
     if (num == null) 
     counts.put(object, 1); 
     else 
     counts.put(object, num+1); 
     return object; 
    } 

    public T release(T object) 
    { 
     Integer num = counts.get(object); 
     if (num == null) 
     throw new IllegalArgumentException("Object not in RefCounter"); 
     else if (num == 1) 
     counts.remove(object); 
     else 
     counts.put(object, num-1); 
     return object; 
    } 


    public boolean usedElsewhere(T object) 
    { 
     Integer num = counts.get(object); 
     return (num != null && num > 1); 
    } 

} 

當您使用對象時,將其添加到RefCounter。

refCounter.using(x); 
someList.add(x); 

當您正在使用該對象做

someList.remove(index); 
refCounter.release(x); 

要測試對象用於別處

if (refCounter.usedElsewhere(x) { 
    return "error"; 
} else { 
    someList.remove(index); 
    refCounter.release(x); 
} 

記住,你需要確保你打電話每次using()release()你保留或釋放一個對象,否則這是毫無意義的。

+0

感謝您提供解決方案。但我看到這種方法的缺點是我需要更新每個添加和刪除的地圖。如果我找不到比這更好的其他解決方案,我將實施您的想法。再次感謝解決方案。 – Prabhu

+0

我認爲這是最好的方法。我會將Map包含到B類定義中,因爲B負責確定它是否已被賦值。 –

相關問題