我有一個看起來像這樣的單例類
public class Data {
private static Data data;
private List<String> list;
private Data() {
list = new ArrayList<>();
}
public static Data getInstance() {
if (data == null) {
data = new Data();
}
return data;
}
public void process() {
//check timestamp value
//process values from list
}
}
我想維護上次處理串列的時間戳。但是,我正在嘗試決定是使用私有類變數來記錄它還是創建一個類似的系統變數System.setProperty("timestamp", System.currentTimeMillis());并訪問它。我的要求是我只想在 Data 類中訪問這個值,但我正在運行另一個使用Data.process. 無論呼叫哪個 DataAccessor 實體,我都想獲得時間戳的最新值,Data.process但我不確定通過系統屬性存盤變數與單例類中的區域變數之間是否存在任何差異。
uj5u.com熱心網友回復:
沒關系,就代碼風格而言,這已經很糟糕了,所以擔心它似乎有點愚蠢。
這不是你制作單身人士的方式
getInstance()如果您從多個執行緒呼叫,它實際上不會是單例。寫吧:
public class Data {
private static final Data data = new Data();
public static Data getInstance() {
return data;
}
}
你在做什么('懶惰'制作單例實體)是雙重無用的:
- 僅當您的代碼“觸及”型別 (
Data) 但不呼叫getInstance(). 這對于所有單身人士來說都是罕見的。 - 只有在創建實體的成本很高時才有用。顯然不是,這里。
這不是你命名課程的方式
Data不是很具有描述性。它的非描述性幾乎是陳詞濫調。更一般地說,一個類代表某種演員——它應該是一個名詞。LogStorage例如,如果這個東西的目的是存盤日志,或者如果AtmLogStorage它專門代表記錄它發出的現金的 ATM 的列印卷,則更好。請明確點。
這不是一個很好的使用單例
可以想象一個系統運行 2 個獨立的概念,這兩個概念都需要相同的日志記錄功能。
無狀態單例(例如:javaCollections或Files類——它們沒有欄位或任何您可以修改的狀態)總是可以的。有狀態的單例,比如這個,通常不是。如果必須,請使用注入框架。
單例很難測驗
在撰寫測驗時,您傾向于設定虛擬版本或以其他方式配置某些物件,而不是在正常運行時,并且您通常希望能夠重復創建在正常運行時僅創建的東西(以隔離測驗)一次。單身人士和“我寫了一個單元測驗”彼此不喜歡。
所以你會怎么做?
制作場地 - 如果可以的話,修復所有其他問題。至少使用該欄位,您可以稍后重構您的代碼并使其可以擁有多個Data(希望您重命名它),即使只是為了測驗目的。系統屬性:
- 無法控制(任何代碼都可以讀取和寫入它們 - 你無法控制它)。
- 是不可見狀態,因為大多數 java 應用程式不使用 sysproperty 存盤來寫入資料。因此,大多數工具都不是為了處理它而撰寫的。如果有人更改了欄位,則可以將除錯工具設定為斷點,在某些代碼更改 sysproperty 時對它們進行斷點要困難得多 - 需要擁有 java 核心源代碼并
setProperty在各種風格的方法上設定條件斷點,oof。 - 是“單例”并且不能從它那里重構,而一個欄位本身就不是單例(事實上只有一個類的實體具有該欄位,這使它成為一個單例,但是改變這方面和你的欄位不再是一個。這很好)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/494918.html
上一篇:如何創建ifelse階梯?
下一篇:我不能使用函式外的區域變數
