2012-06-03 160 views
5

我正在開發一個Android應用程序,我寫的一個方法可能會被稱爲一堆。在這種方法中,我正在更新用戶界面。內存使用和性能對我來說很重要。我看到它的方式,我有2個選項來改變UI。Java:全局變量是否節省內存和/或時間?

首先是使每一次新的對象。也就是說,如下所示:

public void myMethod(){ 
new View().makeVisible(); 
} 

第二種是將對象聲明爲全局變量並在方法中引用它。這可能看起來像:

View myView = new View(); 

public void myMethod(){ 
myView.makeVisible(); 
} 

很明顯,如果這種方法只調用幾次,任何差異將會很小。但是,如果我可能多次調用此方法,並且有很多變量正在調用/或以此方式創建,那麼第二種方法是否會提高性能?

+0

你想重用這些實例嗎? – SLaks

+0

我可以,但我沒有太多 – Flynn

+1

任何時間/空間節省超過10倍的理智成本。 –

回答

2

至於其他的答案表明,重複使用相同的對象,而不是反覆實例爲每一個方法調用會降低你的內存佔用,提高性能相對於垃圾收集一個新的。

但我真的想可維護性第一。重複使用相同的對象會使代碼更加複雜(並且可能會引入錯誤)?在編程時記住效率是很好的,但要避免過早的優化,這會使項目複雜化並降低開發速度。

如果性能和內存使用存在問題,那麼是的,它會讓你受益於重複使用相同的View

final View myView = new View(); //made final because it shouldn't be reassigned 

如果你真的想要得到的資源意識,你甚至可以懶加載對象 - 即只在需要時才創建它。不過,我會建議使用番石榴的Suppliers.memoize(Supplier)照顧這個代替手工編寫該行爲:

final Supplier<View> myViewSupplier = Suppliers.memoize(new Supplier<View>() { 
    @Override 
    public View get() { 
     return new View(); 
    } 
}); 

... 

public void myMethod() { 
    View myView = myViewSupplier.get(); //lazy-loads when first called 
    myView.makeVisible(); 
} 

這可能是極端的這種特殊情況,但。

0

全局變量更高效。

創建新對象有更多的內存佔用,因爲每一個視圖中創建和時間取代了舊觀點,舊的已經拿到垃圾收集。重複使用全局變量的相同視圖可以保存系統創建新對象並收集舊對象的任務。

編輯: 全局變量是隻對對象的引用,而不是一個對象本身。

0

那麼,當你有充分的構造函數創建一個新的實例,實際上要執行的工作又不是絕對必要的。如果我在你的鞋子裏,我會有全局變量選項,然後清除視圖,並儘可能在同一個對象上重繪。這可以防止重複的內存釋放和其他方法分配的可能性,所以除非您認爲清除特別昂貴 - 足以讓它值得它不斷分配新視圖,然後擦除它。

重複使用同一個對象的另一個動機是Java虛擬機實現在使用垃圾收集方面有所不同,因爲一旦變量超出範圍就不能被訪問 - 當與JVM對應的內存被釋放時並不總是一樣的。你可以找到替代方案,你有許多視圖被順序分配的實例,但並不是所有的方法都會被釋放,直到進程閒置一段時間,從而使應用程序成爲一個完全不需要的內存。

1

我不認爲這個決定應該純粹是爲了效率 - 而是在哪個組合更好地代表你試圖建模的領域。要問的問題是「我的班級使用View的正確結構是什麼?」。

使用實例變量不是全局的 - 它包含在聲明它的對象的上下文中。全局變量不應該存在於OO中,儘管公共靜態變量非常接近。

首先要決定的是您的「視圖」實例在邏輯上屬於相對於使用它的類/方法的意圖的位置。如果使用它的類是某種工廠,並且「myMethod」是工廠方法,那麼是返回一個新實例。

如果「查看」是你的班級的邏輯領域,並以某種方式幫助捕捉和增強其狀態和行爲,那麼沒有理由每次都創建一個新的。簡單地維護其狀態,並與現有對象一起工作。

從你的描述看來,你似乎試圖維護和更新某種視圖的狀態。將其更改爲所需狀態並重新顯示它是有意義的,而不是每次都創建一個新對象。從功能上看,這兩種方法在你的場景中都有效,我會採取第二種選擇並避免創建不必要的對象。