包含所有静态成员的单例或类

时间:2013-10-21 15:49:33

标签: java design-patterns

在Java中使用什么更好:单例或具有所有静态成员的类?或者没关系?

例如,我想从不同的类访问X类,但X类必须包含使用它的所有类的类似值。

5 个答案:

答案 0 :(得分:2)

在某些情况下,静态类比Singleton更有意义。您可以看到java.lang.Math的示例。这不是单身人士 - 。它只是为我们提供了一堆静态方法。

如果你的类没有维护任何状态,只提供对某些方法的全局访问,那么你应该使用静态类,因为静态方法比Singleton更快,因为在编译期间静态绑定。请记住,不能将静态方法用于多态,因为无法覆盖静态方法。

如果你想维护对象的状态,你必须使用单例而不是静态方法。当你需要一个具有完全OO功能的类时,选择Singleton,而如果你只需要存储一堆静态方法在一起,而不是使用静态类。

您可以在此处获得详细说明 阅读更多:http://javarevisited.blogspot.com/2013/03/difference-between-singleton-pattern-vs-static-class-java.html#ixzz2iNE3rW4i

答案 1 :(得分:1)

对我来说:Singleton is an anti-pattern并且只应该在有充分理由的情况下使用,在我看来,只有一个类只有公共静态变量是不可接受的,这个声音不是真正面向我的对象。您可以使用Dependency Injection,其好处是可测试性,您可以避免在创建单例时进行双重检查(如果您不使用enum)。

这看起来像:

public class SharedObject{
// content
}


public class Worker{
private final SharedObject sharedObject;
public Worker(SharedObject sharedObject){
this.sharedObject = sharedObject;
}
}

通过这种方式,您还可以看到对象的来源,您可以使用Mocktio轻松模拟共享对象。它迫使您构建代码以便于测试,同时它将采用更模块化的方向。

答案 2 :(得分:1)

对于无状态的类,我更喜欢静态方法,就像MathSystem类,而单例,反之亦然 - >对于有状态的类,例如FacesContext

答案 3 :(得分:0)

全静态类通常用于共享实用程序方法,这些方法在逻辑上组合在一起但不共享它们之间的状态(字段)。

如果出现以下情况,单身人士会更好:

  1. 您可能希望使用具有不同行为的不同对象来扮演该角色。
  2. 该对象需要实现一个接口(例如共享ActionListener
  3. (另一种说法:如果你需要多态性,你的单身必须是一个对象,而不是一个类)

答案 4 :(得分:0)

使用静态方法最好是 not-heritable 不可实例化的类。 e.g:

public final class Constants {

    private Constants() {
        // non-public constructor
    }

    public static final Pattern ID_PATTERN = Pattern.compile("^\\d{4,10}$");

    public static final Locale DEFAULT_LOCALE = new Locale("en", "US");

    ...

}

仅当您要维护某些状态时才使用单例,类似于应用程序范围。但是,如果您想要清洁设计,则必须是两个类。