2011-02-03 48 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将防止并发问题,如果你是在多线程环境中运行此。