在私有实用程序类构造函数中使用的首选Throwable是什么?

Rob*_*ska 27 java coding-style throwable

Effective Java(第二版),第4项,讨论使用私有构造函数来强制执行非实例化.这是本书中的代码示例:

public final class UtilityClass {
    private UtilityClass() {
        throw new AssertionError();
    }
}
Run Code Online (Sandbox Code Playgroud)

然而,AssertionError似乎不是正确的抛出.没有任何东西被"断言",这就是API如何定义AssertionError的使用.

Throwable在这种情况下,通常会有不同的情况吗?通常只会抛出一个Exception带有消息的将军吗?或者为此编写自定义是否常见Exception

这是非常微不足道的,但我认为从形式和标准的角度来看,我只是对它感到好奇.

Chr*_*ung 31

有一个断言:"我断言这个构造函数永远不会被调用".的确,AssertionError这里确实是正确的.

  • 不正确,请参阅javadoc:http://java.sun.com/j2se/1.4.2/docs/api/java/lang/AssertionError.html (2认同)
  • @Charlie javadoc 说“抛出来表明断言失败。” 您将断言视为“使用断言关键字”,而不是“程序员认为这是一个错误” (2认同)
  • 你是对的,我是.这就是为什么它被称为"断言"声明.就像我不会使用NullPointerException来指示值为0而不是范围内的数字的名称,即使该数字是作为索引. (2认同)

Cra*_*lin 11

我喜欢包括Bloch的评论:

// Suppress default constructor for noninstantiability
Run Code Online (Sandbox Code Playgroud)

或者更好,但把它放在错误中:

private UtilityClass()
{
    throw new AssertionError("Suppress default constructor for noninstantiability");
}
Run Code Online (Sandbox Code Playgroud)


Mic*_*rdt 5

UnsupportedOperationException听起来是最合适的,尽管检查异常会更好,因为它可能会警告某人在编译时错误地实例化类。

  • 呵呵,声明它“抛出Throwable”,无论如何抛出一个AssertionError。:-) (3认同)