繁体   English   中英

单例还是静态类?

[英]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。 由于国家是全球性的,因此这是冒险行为。 这也意味着单元测试将是一个很大的痛苦。

还有一件事。 永远不要将实例变量声明为公共变量。 将它们声明为私有或受保护的,并提供获取器和设置器。 同样,也不需要使用默认值初始化实例变量。

静态类和单例模式之间的主要区别在于,如果您需要实现接口等,则可以使用单例。 对于这种特殊情况,我认为使用静态类可能会更好,因为您没有实现任何接口。 关于您的问题是否可以更快地解决,我想说两者之间的差异可以忽略不计,但是使用静态类将减少类的动态实例化的少量开销。

如果需要这样的设计,使用单例有什么不好? 如果您只需要某个对象的一个​​实例来进行指定的操作,那么单例无疑是不错的选择。

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

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

从那里:

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

只为风格

如果不需要,我宁愿不依赖Singleton。 为什么? 凝聚力较小。 如果是可以从外部设置的属性,则可以使用单元测试来测试“活动”(或其他任何内容)。 如果愿意,您可以改变主意以使用不同的实例,依此类推。

我谦虚的建议是在每个Activity中都有一个属性(也许您可以定义一个公共基类?),并使用新的新实例将其设置为Activity初始化。

您的代码对如何获取它一无所知(初始化代码除外,也许您将来可以更改它)。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM