单身或静态类?

时间:2012-09-19 15:01:04

标签: java android singleton

我有以下课程:

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

4 个答案:

答案 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代码除外,您可以在将来更改它。)

但正如我所说的......只是品味问题! :)