/* 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. “公共静态”还是“静态公共”?
- 5. PHP |为什么我应该使用公共静态/私有静态函数而不是公共/私有函数?
- 6. 静态后期绑定是否需要重载静态变量?
- 7. 非静态私有变量
- 8. 静态私有变量
- 9. C#BestPractice:私人var和公共的getter/setter或公共变种
- 10. 静态变量不需要
- 11. 私人和公共变量
- 12. 是否需要删除静态向量?
- 13. 访问公共静态变量
- 14. System.setProperty或公共静态变量?
- 15. 公共类,但私有成员变量?
- 16. 在构造函数中访问共享静态变量是否需要同步?
- 17. 在一个类中使用私有静态变量是否好?
- 18. 公共变量 - 需要的属性C#
- 19. getter/setter VS公共变量的好处?
- 20. 需要了解公共和私人
- 21. 公共getter和setter方法私人
- 22. 是否为线程更新了公共静态变量? (是线程安全的?)
- 23. '公共静态最终'或'私人静态最终'与getter?
- 24. 为什么要对公共变量进行私有变量更改?
- 25. 私有公有变量;
- 26. 带有getter的公共静态final变量
- 27. 需要澄清C#静态变量
- 28. 公共静态HashTable
- 29. 我怎样才能改变静态公共变量
- 30. setter函数的参数名称是否需要与javascript中的私有变量不同?
字段值如何被初始化?为什么它们必须是静态的? – crowne 2011-02-03 15:02:24
我不需要服务的实例,因为它从另一个AbstractService类派生。所以我将使用静态字段,以便后来的开发人员不尝试实例化对象。 – ada 2011-02-03 15:06:23