[英]Singleton or static class?
我有以下课程:
public class EnteredValues {
private HashMap<String, String> mEnteredValues;
public boolean change = false;
public boolean submit = false;
private static final EnteredValues instance = new EnteredValues();
// Singleton
private EnteredValues() {
mEnteredValues = new HashMap<String, String>();
}
public static EnteredValues getInstance() {
return instance;
}
public void addValue(String id, String value) {
if (mEnteredValues.put(id, value) != null) {
// A change has happened
change = true;
}
}
public String getValueForIdentifier(String identifier) {
return mEnteredValues.get(identifier);
}
public HashMap<String, String> getEnteredValues() {
return mEnteredValues;
}
public void clean() {
mEnteredValues.clear();
change = false;
submit = false;
}
}
该类用于管理用户已经输入的值,并且该类应可供应用程序中的所有类访问。
当活动发生变化时,我通过调用clear方法来“重置”单例。
我选择单例模式时并没有真正考虑静态类的选项。
但是现在我想知道是否不应该只使用静态类。
处理只管理值的类的常用方法是什么? 静态类作为单例更快吗?
谢谢
您提供一种清晰的方法来重置Singleton状态的事实表明,您不应使用Singleton。 由于国家是全球性的,因此这是冒险行为。 这也意味着单元测试将是一个很大的痛苦。
还有一件事。 永远不要将实例变量声明为公共变量。 将它们声明为私有或受保护的,并提供获取器和设置器。 同样,也不需要使用默认值初始化实例变量。
静态类和单例模式之间的主要区别在于,如果您需要实现接口等,则可以使用单例。 对于这种特殊情况,我认为使用静态类可能会更好,因为您没有实现任何接口。 关于您的问题是否可以更快地解决,我想说两者之间的差异可以忽略不计,但是使用静态类将减少类的动态实例化的少量开销。
如果需要这样的设计,使用单例有什么不好? 如果您只需要某个对象的一个实例来进行指定的操作,那么单例无疑是不错的选择。
阅读http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html
从那里:
注意:静态嵌套类与它的外部类(和其他类)的实例成员进行交互,就像其他任何顶级类一样。 实际上,静态嵌套类在行为上是顶级类,为了包装方便,该顶级类已嵌套在另一个顶级类中。
只为风格
如果不需要,我宁愿不依赖Singleton。 为什么? 凝聚力较小。 如果是可以从外部设置的属性,则可以使用单元测试来测试“活动”(或其他任何内容)。 如果愿意,您可以改变主意以使用不同的实例,依此类推。
我谦虚的建议是在每个Activity中都有一个属性(也许您可以定义一个公共基类?),并使用新的新实例将其设置为Activity初始化。
您的代码对如何获取它一无所知(初始化代码除外,也许您将来可以更改它)。
但是正如我所说的...只是一个口味问题! :)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.