2013-04-04 17 views
0

你如何返回memberVariable(含對象)如何返回memberVariable(Object)並重置它,而不重置之前返回的成員變量?

  • 沒有低效複製(複製存儲器)的成員變量的對象

,然後重置成員變量

  • 沒有覆蓋返回的成員變量的觀察者的對象是否獲得之前的「副本」?

下面是一個例子代碼:

public class SomeClass extends Observable { 

    private Object someObject; 

    private void whenSomethingHappens() { 
    this.setChanged();   
    this.notifyObservers(someObject); // TODO: return the object without copying it in RAM 
    this.someObject = new Object(); // TODO: create a new empty object somwhere else in RAM such as it doesn't override the returned object of before 
    } 

} 
+0

這些看起來像是相反的要求。該方法使用與存儲在成員字段中相同的對象(第一個要求),或者使用不同的對象(第二個要求)。在每種情況下,都違反了其他要求。 – 2013-04-04 21:36:29

+0

我很難搞清楚你想要什麼......雖然我懷疑它已經在做你想做的了。 Java按值傳遞引用; 'notifyObservers(someObject)'不會創建'someObject'的副本(除非實際在''notifyObservers''實現中明確地創建一個副本)。 – 2013-04-04 21:36:37

+5

你不知道。您不能複製副本而無法制作副本。不要過早優化。該副本可能不是問題。 – 2013-04-04 21:36:52

回答

3

,你已經做了你想要的代碼。

this.notifyObservers(someObject) 

這將對someObject的引用傳遞給方法notifyObservers。沒有新的對象被創建,所以沒有額外的內存用完(除了創建對現有對象的額外引用)。

this.someObject = new Object(); 

這會在內存中創建一個新對象,然後覆蓋引用someObject。如果notifyObservers存儲了對原始對象的引用,它不受此代碼行的影響。

+0

你是對的!對困惑感到抱歉!我確信它會覆蓋傳遞的對象,但實際上並不是這樣。 – ndrizza 2013-04-04 22:07:58

+0

我不敢相信我從來沒有質疑或意識到這一點!這在我用Java進行編程時,已經徹底改變了我的想法。:)謝謝! – ndrizza 2013-04-04 22:15:16

相關問題