【问题标题】:Singleton or class with all static members [closed]具有所有静态成员的单例或类[关闭]
【发布时间】:2013-10-21 15:49:33
【问题描述】:

在 Java 中哪个更好用:单例还是包含所有静态成员的类?还是没关系?

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

【问题讨论】:

  • Java 是一种面向对象的编程语言。
  • 不,你的要求一点都不清楚。在什么意义上更好?目的是什么?
  • 您提出了一个要求不完整的问题。您需要获得更多的理论知识来决定单例或静态方法是否更好。最好学习模式设计来获得。没有一个答案对您的问题有足够的帮助。

标签: java design-patterns


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    对我来说: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 轻松模拟共享对象。它迫使您构建代码以便于测试,同时它将朝着更加模块化的方向发展。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        如果满足以下条件,单例会更好:

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

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

        【讨论】:

          【解决方案5】:

          最好是 not-heritablenon-instantiable 类带有静态方法。例如:

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

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

          【讨论】:

            猜你喜欢
            • 2010-10-17
            • 2012-12-15
            • 1970-01-01
            • 1970-01-01
            • 2019-11-19
            • 1970-01-01
            • 2012-09-28
            • 1970-01-01
            相关资源
            最近更新 更多