java中的静态类

Java: Static Class?

我有一个满是实用功能的班级。实例化它的一个实例没有语义意义,但我仍然想调用它的方法。最好的方法是什么?静态类?抽象?


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


根据伟大的书"有效Java":

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

-试图通过将类抽象化来强制实现非恒定性是行不通的。

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

1
2
3
4
5
6
7
8
// Noninstantiable utility class
public class UtilityClass
{
    // Suppress default constructor for noninstantiability
    private UtilityClass() {
        throw new AssertionError();
    }
}

因为显式构造函数是私有的,所以它在类外部是不可访问的。断言错误不是严格要求的,但它提供了保险,以防意外地从类中调用构造函数。它保证类在任何情况下都不会被实例化。这个习语有点违反直觉,因为构造函数是明确提供的,所以不能调用它。因此,如上文所示,最好包括注释。

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


听起来您有一个类似java.lang.math的实用程序类。该方法有带有私有构造函数和静态方法的最终类。

但是要注意这对可测试性有什么作用,我建议您阅读本文静态方法是可测试性的死


仅仅为了逆流而上,静态成员和类不参与OO,因此是邪恶的。不,不是邪恶的,但说真的,我建议使用具有单例模式的常规类进行访问。这样,如果您需要在任何情况下超越行为,这不是一个主要的重组。哦是你的朋友——)

我的02美元


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

不要花太多时间来确保你的课不会被滥用。对你的同事有信心。不管你如何保护你的班级,总有一种方法可以滥用它。唯一不能误用的是一件完全无用的东西。


  • 最终类和私有构造函数(好但不重要)
  • 公共静态方法


声明类为static是没有意义的。只需声明它的方法EDCOX1×0,就可以从类名调用它们,就像Java的数学类一样。

此外,即使没有严格要求将构造函数设置为私有,但这样做是一个好主意。将构造函数标记为私有将阻止其他人创建类的实例,然后从这些实例调用静态方法。(这些调用在爪哇工作完全一样,它们只是误导和损害代码的可读性。)