2011-02-03 49 views
3
/* 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()); 

} 
+0

字段值如何被初始化?爲什麼它們必須是靜態的? – crowne 2011-02-03 15:02:24

+0

我不需要服務的實例,因爲它從另一個AbstractService類派生。所以我將使用靜態字段,以便後來的開發人員不嘗試實例化對象。 – ada 2011-02-03 15:06:23

回答

6

不,並不總是需要一個私有變量公衆制定者。提供公共setter(和getter,就此而言)的想法是基於 - 類的外部實體需要訪問您正在編寫的特定代碼片段的內部。吸氣者和設置者爲此提供了公共接口。但是,您並不一定需要爲您創建的每個私有變量提供一個公共getter或setter,因爲該私有變量可能只存在於內部專用於該類的私有變量中。

你必須決定是否特別需要根據你的代碼的特殊需求,我們對您的私有變量的訪問。

更新在評論

基於ADA的問題你可以給你的直接列表中的用戶訪問(是 - 他們可以利用吸氣,然後編輯列表)。如果你信任你的代碼的用戶,這可能會工作。但是,由於各種原因,您可能不希望讓他們直接訪問您的列表(特別是因爲它允許他們自由地執行他們想做的事情,如果您在應用程序中進行線程化,則會產生問題等) 。在這種情況下,您應該提供接口到底層列表中。例如,在你的類,而不是提供getSubscribedFields(),您可能要提供類似的方法:

// Pseudocode 
public String getSubscribedField(int i) { 
    return subscribedFields.Get(i); 
} 

public String addSubscribedField(String field) { 
    subscribedFields.Add(field); 
} 

希望這有助於澄清事情有點你。

+0

我需要一些用戶代碼來更改字段列表。所以我需要訪問外面的私人領域。如果用戶能夠通過調用getter並更改返回的列表來更改列表,是不是setter冗餘? – ada 2011-02-03 15:09:06

+0

@ada - 查看我的更新回覆。 – JasCav 2011-02-03 15:26:17

+0

非常感謝。這清理了很多。 – ada 2011-02-03 15:36:32

1

在這種情況下,更流行的選擇是使用單例,你用的字段初始化一次。然而,連Singleton都不是一個好主意,但是否則就需要我們更多地瞭解你想要做的事情。在大多數情況下,您可以通過使其成爲具有長生命週期的類的成員來避免使用靜態實例。例如,如果這些字段與數據庫字段相關,則可以將其與一個表類相關聯,該表類包含與數據庫表有關的信息。

實際上它取決於你要完成的任務。

1

不,你不應該。甚至更多,你應該避免靜態。

1

你的班級似乎很容易出現線程安全問題。我也質疑您的需求將您的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將防止併發問題,如果你是在多線程環境中運行此。