我有以下课程:
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方法'重置'单例。
我选择了单例模式而没有真正考虑静态类的选项 但现在我想知道我是否应该只使用静态类..
处理一个只管理值的类的常用方法是什么? 作为单身人员,静态类更快吗?
THX
答案 0 :(得分:4)
事实上,您提供了一种清除方法来重置Singleton的状态,这决定了您不应该使用Singleton。这是一种冒险行为,因为国家是全球性的。这也意味着单元测试将是一个巨大的痛苦。
还有一件事。永远不要将实例变量声明为公共变量。将它们声明为私有或受保护,并提供getter和setter。此外,无需使用值作为其默认值初始化实例变量。
答案 1 :(得分:1)
静态类和单例模式之间的主要区别在于,如果需要实现接口等,可以使用单例。对于这种特殊情况,我认为你可能会更好地使用静态类,因为你没有实现任何接口。将你的问题与另一个问题相关联,我认为这个差异可以忽略不计,但是使用静态类会消除类的动态实例化的小开销。
答案 2 :(得分:1)
如果您需要这样的设计,使用单件有什么不好?如果你只需要一个设计用于指定事物的对象的一个实例,那么singleton肯定不是一个糟糕的选择。
@see Are Java static calls more or less expensive than non-static calls?
读 http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html
从那里:
注意:静态嵌套类与其外部类(和其他类)的实例成员交互,就像任何其他顶级类一样。实际上,静态嵌套类在行为上是一个顶级类,它已嵌套在另一个顶级类中以方便打包。
答案 3 :(得分:1)
仅限风格
如果我不需要,我宁愿不依赖Singleton。为什么?凝聚力较弱。如果它是您可以从外部设置的属性,那么您可以使用单元测试来测试您的Activity(或其他)。如果您愿意,可以改变主意使用不同的实例,等等。
我谦虚的建议是在每个活动中都有一个属性(也许你可以定义一个公共基类?),并在活动初始化时使用一个新的实例设置它。
您的代码对如何获取代码一无所知(init代码除外,您可以在将来更改它。)
但正如我所说的......只是品味问题! :)