静态类?

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

114611 次浏览

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

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

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

根据伟大的书 “有效的爪哇”:

第4项: 使用私有构造函数实现非实例化

- 试图通过创建类抽象来强制非实例化是不可行的。

- 只有当一个类不包含显式构造函数时才会生成一个缺省构造函数,所以可以通过包含一个私有构造函数来使一个类不可实例化:

// Noninstantiable utility class
public class UtilityClass
{
// Suppress default constructor for noninstantiability
private UtilityClass() {
throw new AssertionError();
}
}

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

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

只是向上游游动,静态成员和类不参与面向对象,因此是邪恶的。不不是邪恶但说真的我建议你们去上普通课带单例模式的课。这样,如果您需要在以后的任何情况下覆盖行为,这不是一个重大的重组。OO 是你的朋友: -)

我的0.02美元

评论“私有构造函数”的论点: 拜托,开发人员没有那么愚蠢; 但他们很懒惰。创建一个对象然后调用静态方法?不可能。

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

  • Final 类和私有构造函数(很好,但不是必需的)
  • 公共静态方法

听起来你有一个类似于 Java.lang 数学的工具类。
这里的方法是 final 类,带有私有构造函数和静态方法。

但是要注意这对可测试性的影响,我建议您阅读本文
静态方法是可测试性的死亡

您可以使用 lombokhttps://projectlombok.org/features/experimental/UtilityClass中的@UtilityClass 注释