为什么java.util.Objects私有构造函数抛出assertionError

时间:2014-09-04 06:08:04

标签: java

我观察到java.util.Objects有一个抛出AssertionError的构造函数。

 * @since 1.7
 */
public final class Objects {
    private Objects() {
        throw new AssertionError("No java.util.Objects instances for you!");
    }
 ...

这是一个静态实用程序类,因此不需要实例。

我理解的一个可能原因是,开发人员正在尝试确保不创建此类的实例。作为任何人可以调用此构造函数的唯一方法是通过反射。

有没有其他理由拥有这种构造函数?

2 个答案:

答案 0 :(得分:12)

唯一的目的是强制执行非实例化。由于它是privateAssertionError主要用于反射和类本身,因为可以从类本身调用私有构造函数。作为副作用,这个习惯用法也会阻止类被子类化。

从Effective Java 2nd Edition引用第4项:

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

因为显式构造函数是私有的,所以它在外部是不可访问的   类。 AssertionError不是严​​格要求的,但它提供了保险   case意外地从类中调用构造函数。它保证   在任何情况下都不会实例化该类。这个成语是   有点违反直觉,因为构造函数是明确提供的,所以它不能   被调用。因此,如上所示,包括评论是明智的。   作为副作用,这个习惯用法也会阻止类被子类化。所有   构造函数必须显式或隐式地调用超类构造函数,并且a   子类将没有可访问的超类构造函数来调用。

此外,您可能会发现此问题很有用:

What is the preferred Throwable to use in a private utility class constructor?

答案 1 :(得分:0)

他们刚刚创建了这个私有构造函数,以确保没有人可以实例化这个类。并且为了防止使用反射进行实例化,会抛出错误。所以我认为你对这个结构的理解是正确的;)

相关问题