簡體   English   中英

使用變量存儲值還是直接從對象獲取值?

[英]Using variables to store values or directly get values from the objects?

場景是我需要至少兩次訪問一個值。 即我正在使用記錄器來跟蹤應用程序中正在發生的事情。 我想記錄對象的名稱,該函數正在運行,以后再使用相同的名稱進行操作(即檢查它是否包含一些字符串或將其放入數組中)。

將名稱存儲在變量中:

foo(Bar bar){
    String name = bar.getName();
    logger.info("I am working with "+name);
    this.doSomethingWith(name);
}

或兩次調用getName():

foo(Bar bar){
    logger.info("I am working with "+bar.getName());
    this.doSomethingWith(bar.getName());
}

我了解,在第一種情況下,我將創建一個新的String,為其分配一個值,然后兩次檢索該值。 這樣,我正在使用更多的內存資源,對嗎?

在第二種情況下,我是否兩次訪問對象欄,然后兩次訪問其名稱。 我想這不是DRY方法。 但另一方面,我不是在記憶中重復自己,對嗎?

哪種方法更好?

在第一個示例中,您沒有使用更多的內存,因為String是一個不可變的對象。 這樣,對String的任何引用都只是指向內存中同一對象的指針。

后一個選項還存在一些線程安全性問題,其中getName()的結果可能在兩次調用之間發生變化。 盡管可能不太可能,但是您可能需要考慮這一點。

考慮到這一點,我將建議第一個選項,即使它更“健談”。

注意: getName()也有可能是通過計算生成的,在這種情況下,您實際上會以比第一種方法更多的內存使用第二種方法。

您的Bar應該是一成不變的階級(在大多數情況下)。 對於不可變的類,這些方法是相同的,因此您可以隨意選擇。

僅當Bar可變時,才會發生任何實際問題,因此bar.name值可以在兩次讀取之間更改。 但是這種情況將使用Bar作為域對象(似乎是這樣)進行渲染是毫無意義的。 您可以通過在foo()頂部創建bar本地副本來解決這種情況。 然后,再次獲得原始bar本地副本后,您可以選擇自己喜歡的任何方式。

因此,這是口味問題。 是的,在第一種情況下,您可能會浪費一點內存用於本地引用,但是最有可能的是,JVM將對其進行優化,使其看起來像字節碼級別的第二種方式。

就個人而言,我更喜歡第二種方法。 確實,我通常僅在必要時創建臨時變量。

Martin Fowler( http://en.wikipedia.org/wiki/Martin_Fowler )也遵循此准則。 他在我讀過的書中提到了它:

http://www.amazon.fr/Refactoring-Improving-Design-Existing-Code/dp/0201485672

有關此主題的書的免費摘錄在這里:

http://sourcemaking.com/refactoring/replace-temp-with-query

有人認為刪除臨時變量可能會導致性能問題。

正如馬丁·福勒(Martin Fowler)所說:

在這種情況下,您可能會擔心性能。 與其他性能問題一樣,讓它暫時滑動。 十分之九的時間無所謂。 當這很重要時,您將在優化過程中解決問題。 更好地分解代碼后,您通常會發現更強大的優化,而無需重構就可能會錯過這些優化。 如果情況變得更糟,很容易將溫度降低。

但是無論如何,這是一個品味問題。 有些人發現第一種方法更具可讀性,其他人則發現第二種方法。 我真的更喜歡第二種方法,因為我討厭為臨時變量添加沒有實際值的行:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM