-1

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

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

4

5 回答 5

2

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

如果您的类没有维护任何状态,而只是提供对某些方法的全局访问,那么您应该使用静态类,因为静态方法比单例更快,因为在编译时是静态绑定。请记住,您不能将多态性与静态方法一起使用,因为不能覆盖静态方法。

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

你可以在这里有详细的描述阅读更多:http: //javarevisited.blogspot.com/2013/03/difference-between-singleton-pattern-vs-static-class-java.html#ixzz2iNE3rW4i

于 2013-10-21T16:12:44.180 回答
1

对我来说:Singleton 是一种反模式,只有在有充分理由的情况下才应该使用,而且我认为仅保留公共静态变量的类是不可接受的,这听起来对我来说不是真正的面向对象。您可以使用Dependency Injection,好处是可测试性,并且您可以避免在创建单例时进行双重检查(如果您不使用enum)。

这看起来像:

public class SharedObject{
// content
}


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

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

于 2013-10-21T16:01:04.060 回答
1

我更喜欢无状态类的静态方法,就像MathorSystem类,反之亦然 -> 对于有状态的类,比如FacesContext.

于 2013-10-21T16:20:02.880 回答
0

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

如果满足以下条件,单身人士会更好:

  1. 您可能希望具有不同行为的不同对象扮演该角色。
  2. 对象需要实现一个接口(例如 shared ActionListener

(另一种说法:如果你需要多态,你的单例必须是一个对象而不是一个类)

于 2013-10-21T16:00:25.003 回答
0

最好是具有静态方法的不可继承不可实例化的类。例如:

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");

    ...

}

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

于 2013-10-21T16:46:17.463 回答