/* Atleast is it needed in this case?*/
public class Service
{
private static List<String> subscribedFields;
private static List<String> unsubscribedFields;
//---------------------------------
// is this necessary?
//---------------------------------
public static void setFields(List<String> subscribedFields, List<String> unsubscribedFields)
{
Service.subscribedFields = subscribedFields;
Service.unsubscribedFields = unsubscribedFields;
}
public static List<String> getSubscribedFields()
{
return subscribedFields;
}
public static List<String> getUnsubscribedFields()
{
return unsubscribedFields;
}
}
// some other class
public class User{
// Is this not enough to change the lists? Isn't the setter redundant?
Change(Service.getSubscribedFields());
Change(Service.getUnsubscribedFields());
}
回答
不,並不總是需要一個私有變量公衆制定者。提供公共setter(和getter,就此而言)的想法是基於 - 類的外部實體需要訪問您正在編寫的特定代碼片段的內部。吸氣者和設置者爲此提供了公共接口。但是,您並不一定需要爲您創建的每個私有變量提供一個公共getter或setter,因爲該私有變量可能只存在於內部專用於該類的私有變量中。
你必須決定是否特別需要根據你的代碼的特殊需求,我們對您的私有變量的訪問。
更新在評論
基於ADA的問題你可以給你的直接列表中的用戶訪問(是 - 他們可以利用吸氣,然後編輯列表)。如果你信任你的代碼的用戶,這可能會工作。但是,由於各種原因,您可能不希望讓他們直接訪問您的列表(特別是因爲它允許他們自由地執行他們想做的事情,如果您在應用程序中進行線程化,則會產生問題等) 。在這種情況下,您應該提供接口到底層列表中。例如,在你的類,而不是提供getSubscribedFields(),您可能要提供類似的方法:
// Pseudocode
public String getSubscribedField(int i) {
return subscribedFields.Get(i);
}
public String addSubscribedField(String field) {
subscribedFields.Add(field);
}
希望這有助於澄清事情有點你。
在這種情況下,更流行的選擇是使用單例,你用的字段初始化一次。然而,連Singleton都不是一個好主意,但是否則就需要我們更多地瞭解你想要做的事情。在大多數情況下,您可以通過使其成爲具有長生命週期的類的成員來避免使用靜態實例。例如,如果這些字段與數據庫字段相關,則可以將其與一個表類相關聯,該表類包含與數據庫表有關的信息。
實際上它取決於你要完成的任務。
不,你不應該。甚至更多,你應該避免靜態。
你的班級似乎很容易出現線程安全問題。我也質疑您的需求將您的List作爲靜態變量的相關性。另一件事,你的setter不符合JavaBeans setters & getter標準,如果你想要與一些通用框架集成,你可能會遇到問題。
我建議你一個你班級的變化。我重構了它,以保持課堂的責任是保持訂閱。
如果你使用像Spring或Guice的依賴注入框架,你可以簡單地作出這樣一個類,並將其注入到需要這個對象的類。
public class SubscriptionServiceUsingDependencyInjection {
private final Set<String> subscribedFields = new CopyOnWriteArraySet<String>();
public boolean isSubscribed(String field_) {
return subscribedFields.contains(field_);
}
public void subscribe(String field_) {
subscribedFields.add(field_);
}
}
否則,如果你真的需要一個單身,你可以使用一個枚舉來達到同樣的目標:
public enum SubscriptionServiceUsingASingleton {
INSTANCE;
private final Set<String> subscribedFields = new CopyOnWriteArraySet<String>();
public boolean isSubscribed(String field) {
return subscribedFields.contains(field);
}
public void subscribe(String field) {
subscribedFields.add(field);
}
}
的CopyOnWriteArraySet將防止併發問題,如果你是在多線程環境中運行此。
- 1. 傳遞一個私有變量的公共靜態變量C#
- 2. 公共靜態與靜態公共 - 是否有區別?
- 3. 公共靜態變量值
- 4. 私有/公共變量Javascript
- 5. 公共類與相同類的私有靜態變量
- 6. 「公共靜態」還是「靜態公共」?
- 7. PHP |爲什麼我應該使用公共靜態/私有靜態函數而不是公共/私有函數?
- 8. 靜態後期綁定是否需要重載靜態變量?
- 9. 靜態私有變量
- 10. 私有靜態變量
- 11. 非靜態私有變量
- 12. C#BestPractice:私人var和公共的getter/setter或公共變種
- 13. 是否存在公共靜態最終類變量
- 14. 方法和變量有非靜態需要是靜態錯誤
- 15. C++從公共靜態方法訪問私有靜態成員?
- 16. 靜態變量不需要
- 17. 私人和公共變量
- 18. 是否需要刪除靜態向量?
- 19. 封裝是否需要比公共變量更多的處理
- 20. 訪問公共靜態變量
- 21. System.setProperty或公共靜態變量?
- 22. 單和公共靜態變量的Java
- 23. 公共靜態變量訪問
- 24. 公共類,但私有成員變量?
- 25. C#中的私有/公共變量
- 26. 公共/私有變量聲明中它
- 27. 在構造函數中訪問共享靜態變量是否需要同步?
- 28. 如何在靜態方法中訪問公共和私有變量?
- 29. 公共靜態函數的返回值分配給私有變量
- 30. 將變量從公共類傳遞給公共靜態類
字段值如何被初始化?爲什麼它們必須是靜態的? – crowne 2011-02-03 15:02:24
我不需要服務的實例,因爲它從另一個AbstractService類派生。所以我將使用靜態字段,以便後來的開發人員不嘗試實例化對象。 – ada 2011-02-03 15:06:23