Java:静态类?

Java:静态类?,java,class,oop,static,utility,Java,Class,Oop,Static,Utility,我有一个充满实用函数的类。实例化它的实例没有任何语义意义,但我仍然想调用它的方法。处理这个问题的最好方法是什么?静态类?抽象?标记为final的类上的私有构造函数和静态方法。将该类声明为静态没有意义。只需声明它的方法static,并像Java的类一样从类名调用它们 此外,尽管严格来说没有必要将构造函数设置为私有,但这样做是一个好主意。将构造函数标记为私有可以防止其他人创建类的实例,然后从这些实例调用静态方法。(这些调用在Java中的作用完全相同,它们只是误导并损害代码的可读性。)根据这本好书:

我有一个充满实用函数的类。实例化它的实例没有任何语义意义,但我仍然想调用它的方法。处理这个问题的最好方法是什么?静态类?抽象?

标记为final的类上的私有构造函数和静态方法。

将该类声明为
静态
没有意义。只需声明它的方法
static
,并像Java的类一样从类名调用它们


此外,尽管严格来说没有必要将构造函数设置为私有,但这样做是一个好主意。将构造函数标记为私有可以防止其他人创建类的实例,然后从这些实例调用静态方法。(这些调用在Java中的作用完全相同,它们只是误导并损害代码的可读性。)

根据这本好书:

第4项:使用私有构造函数强制执行不稳定性

-试图通过使类抽象来强制不可实例化是行不通的

-只有当类不包含显式构造函数时,才会生成默认构造函数,因此可以通过包含私有构造函数使类不可实例化:

因为显式构造函数是私有的,所以在类之外无法访问它。AssertionError并不是严格要求的,但它提供了一种保险,以防从类中意外调用构造函数。它保证在任何情况下都不会实例化该类。这个习惯用法有点违反直觉,因为构造函数是明确提供的,因此不能被调用。因此,明智的做法是添加注释,如上所示


作为一个副作用,这个习惯用法还防止类被子类化。所有构造函数都必须显式或隐式调用一个超类构造函数,子类将没有可访问的超类构造函数可调用。

只是向上游游,静态成员和类不参与OO,因此是邪恶的。不,不是邪恶的,但说真的,我建议使用一个带有单例模式的常规类进行访问。这样,如果您需要在以后的任何情况下覆盖行为,那么它不是一个重大的重新配置。OO是你的朋友:-)

我的.02美元对“私有构造函数”参数的评论:得了吧,开发人员没有那么愚蠢;但是他们很懒。创建一个对象然后调用静态方法?不会发生的

不要花太多时间来确保你的课程不会被滥用。对你的同事要有信心。不管你如何保护你的类,总有办法滥用它。唯一不能被滥用的东西是完全无用的东西。

  • 最终类和私有构造函数(良好但非必需)
  • 公共静态方法

    • 听起来您有一个类似的实用程序类。
      这里的方法是使用私有构造函数和静态方法的最终类

      但是要注意这对可测试性的影响,我建议阅读本文

      您也可以使用lombok中的@UtilityClass注释,别忘了创建一个私有构造函数。@Asah:同意。我在回答中加了一点。谢谢。如果你想在一个内部类中使用静态方法,那么这个类也必须是静态的。顺便说一句,你不能让顶级类成为静态的……单例也被认为是邪恶的。你使用私有构造函数来阻止任何人实例化或子类化这个类。参见David Robles的回答:singleton并不比依赖注入更邪恶:)OO有它的位置,但有时它并不实用,或者会浪费资源——例如,像Math.abs()这样简单的东西。当静态方法调用在没有任何O-O开销的情况下也能为您提供服务时,没有理由仅仅为了实例化对象而实例化对象@我同意rob Reoo,数学。Abs可能永远不需要实例。当我听到“我有一个实用程序类”时,我看到Math.Avg(),在这里您现在需要添加支持的加权平均值。我看到一个Url生成器、param in、Url out需要重构以支持href或Url only等。出于这些原因,使用基于OO的实用程序类可以获得回报。还有,现在我要放弃标准的OO防御策略,测试/我是一个见过(在生产代码中,而不是jsut学生代码中)object.staticMethod的人。我认为你高估了Joe Random程序员的能力!:-P@mattb:正如大卫·罗伯斯在他的回答中指出的那样,你不需要期末考试。。。它不能被子类化,因为子类将无法调用超类构造函数,因为它是私有的。然而。。。直言不讳没有坏处。但是jfyi:-)。java.lang.Math“死亡到可测试性”也是如此吗?看看它在运行时的得分可能会很有趣,为什么你选择了
      AssertionError
      ,而不是其他选择,比如
      IllegalStateException
      UnsupportedOperationException
      ,等等?@Pacerier-see.@bcsb1001,这让我们想到了。
      // Noninstantiable utility class
      public class UtilityClass
      {
          // Suppress default constructor for noninstantiability
          private UtilityClass() {
              throw new AssertionError();
          }
      }