2012-10-19 27 views
0

最近,我有以下想法:當你定義你的對象,並重寫toString方法,這可能在程序執行過程中多次調用。我不確定某些UI組件是如何自我刷新的(刷新時JTable調用每個單元成員的toString方法),或者每次當您執行修改對象的指令時調試器都會調用toString等等。無論如何,我在考慮它是否會有利的是定義一個懶洋洋地評估String作爲我們的字符串定義,如果我們的結構是不變的:爪哇 - 使用的toString懶惰字符串值

private String toString; 
//.. definitions of many components, sets, lists which won't change 

public String toString(){ 
    if (toString == null) // instantiate 
    return toString; 
} 

請問上面是值得做的事情?

+0

不會有所作爲,因爲字符串對象無論如何都是不可變的。從方法的返回 – Jivings

+0

無用「的原因IIRC,一個新的String對象將被分配, – BigMike

+0

如果你調用toString並且每次生成一個新的字符串時,你可能會花substantail時間通過內部集迭代,建立一個字符串,然後返回一個新的對象,沒什麼用,因爲它與前一個完全一樣。這是我的理由 – Bober02

回答

2

如果字符串創建過程是漫長而創建的字符串經常會用到,你應該存放。如果沒有,就看你有多少次調用

如果CLASSE是不變的(內存和CPU時間之間總是老一套的戰爭)的toString()方法,你知道toString()方法將至少調用一次,你應該在構造函數中(或在工廠)實例化字符串,而不是經常檢查。

0

優化的標準規則在這裏發揮作用。

  1. 不要這樣做。
  2. (僅適用於專家)不要這樣做 - 至少在您掌握瞭解釋爲什麼這是一個需要解決的問題的分析信息之前。

由於性能原因,您正在失去清晰度和可維護性,因此量化這些性能原因以及它們是否值得花費。

0

由於Javas String Literal Pool的存在,您不必擔心這一點。假設你沒有創建許多獨特的字符串,Java將在加載類文件或初始化時遍歷代碼並查找字符串,並將它們添加到字符串文字池中。

這是一個偉大的文章,概述這個漂亮圖表 - String Literal Pool Overview

其他建議是使用StringBuffers作爲獨立的部分將不會被添加到緩衝區只輸出字符串。

使StringBuffer的靜態也將避免每次創建一個新的對象,但它實際上取決於您是否經常調用toString()。

如果這是真的不多探查湯姆·約翰遜建議將採取下一步的方向瓶頸。