2

我有以下课程:

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 方法“重置”单例。

我选择了单例模式而没有真正考虑静态类的选项。
但现在我想知道我是否不应该只使用静态类..

处理只管理值的类的常用方法是什么?静态类比单例更快吗?

谢谢

4

4 回答 4

4

您提供了一种清晰的方法来重置 Singleton 的状态,这一事实表明您不应该使用 Singleton。这是一种危险的行为,因为国家是全球性的。这也意味着单元测试将是一个很大的痛苦。

还有一件事。永远不要将实例变量声明为公共的。将它们声明为私有或受保护并提供 getter 和 setter。此外,无需使用默认值初始化实例变量。

于 2012-09-19T15:19:09.267 回答
1

静态类和单例模式之间的主要区别在于,如果您需要实现接口等,可以使用单例。对于这种特殊情况,我认为使用静态类可能会更好,因为您没有实现任何接口。将您的问题与另一个问题联系起来,我想说差异可以忽略不计,但是使用静态类将消除类动态实例化的一小部分开销。

于 2012-09-19T15:12:27.190 回答
1

如果您需要这样的设计,使用单例有什么不好?如果你需要某个对象的一个​​实例来做指定的事情,那么单例肯定不是一个糟糕的选择。

@see Java 静态调用比非静态调用更贵还是更便宜?

阅读 http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html

从那里:

注意:静态嵌套类与其外部类(和其他类)的实例成员交互,就像任何其他顶级类一样。实际上,静态嵌套类在行为上是一个顶级类,为了方便打包,它已经嵌套在另一个顶级类中。

于 2012-09-19T15:16:28.093 回答
1

Just for style

I prefer not to rely on Singleton if I don't need to. Why? Less cohesion. If it's a property you can set from outside, then you can test your Activity (or whatever) with unit testing. You can change your mind to use diferent instances if you like, and so on.

My humble advise is to have a property in each of your Activities (maybe you can define a common base class?), and set it at activity initialization with a new fresh instance.

Your code will not know nothing about how to get it (except the init code and maybe you can change it in the future).

But as I've said... just a matter of taste! :)

于 2012-09-19T15:17:52.653 回答