Java:静态类?

问题描述 投票:129回答:8

我有一个充满实用程序功能的类。实例化它的实例没有语义,但是我仍然想调用它的方法。处理此问题的最佳方法是什么?静态课?摘要?

java class oop static utility
8个回答
161
投票

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


93
投票

根据好书"Effective Java"

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

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

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

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

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

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


21
投票

听起来像您有一个类似于java.lang.Math的实用程序类。这里的方法是带有私有构造函数和静态方法的最终类。

但是请注意这对可测性有何作用,我建议您阅读本文Static Methods are Death to Testability


6
投票

只是游向上游,静态成员和类不参与OO,因此是邪恶的。不,不是邪恶的,但认真地说,我建议使用具有单例模式的常规类进行访问。这样,如果您在任何情况下都需要覆盖行为,则不是主要的重组。 OO是你的朋友:-)

我的$ .02


3
投票

关于“私有构造函数”的评论:来吧,开发人员并不那么愚蠢;但是他们很懒。创建一个对象然后调用静态方法?不会发生。

不要花太多时间来确保您的课程不会被滥用。对您的同事有一些信心。无论您如何保护课堂,总有一种滥用课堂的方法。唯一不能滥用的是完全没有用的东西。


2
投票
  • 最终类和私有构造函数(不错,但不是必须的)
  • 公共静态方法

1
投票

将类声明为static没有意义。只需声明其方法static并从类名正常调用它们即可,就像Java的Math类一样。

而且,即使严格不要求将构造函数设为私有,这也是一个好主意。将构造函数标记为私有可防止其他人创建您的类的实例,然后从这些实例中调用静态方法。 (这些调用在Java中的工作原理完全相同,只是误导并损害了代码的可读性。)


0
投票

您可以使用来自龙目岛https://projectlombok.org/features/experimental/UtilityClass的@UtilityClass批注>

© www.soinside.com 2019 - 2024. All rights reserved.