何が優先のスロー可能オブジェクトを使用する個人のユーティリティクラスのコンストラクタ?

StackOverflow https://stackoverflow.com/questions/398953

  •  29-08-2019
  •  | 
  •  

質問

有効なJava(第二版), 項4ついてのコンストラクタに実施noninstantiability.こちらのコードからのサンプル帳

public final class UtilityClass {
    private UtilityClass() {
        throw new AssertionError();
    }
}

しかし、 AssertionError なのものへの投.いている"と主張され、どのようにAPIを定義する利用 AssertionError.

が異なる Throwable これは、通常、この状況は?いんげ一般 Exception メッセージ?ているのか、あるいは共通の書きカスタム Exception す。

かなが何よりも私は好奇心を持つことから始まからのスタイルと標準的な視点で

役に立ちましたか?

解決

アサーションがあります:「私はこのコンストラクタが呼び出されないことを主張しています」。だから、確かに、AssertionErrorはここに正しいです。

他のヒント

私はブロッホさんのコメントなど、好きます:

// Suppress default constructor for noninstantiability

いっそのエラーでそれを入れてます:

private UtilityClass()
{
    throw new AssertionError("Suppress default constructor for noninstantiability");
}

にUnsupportedOperationException の最高のように聞こえますフィット、それは誰かが誤ってコンパイル時にクラスをインスタンス化警告するかもしれないので、チェック例外があっても良いだろうけれどもます。

IllegalAcessError のはどう? :)

しかしながら、生活全般に関するジ状 いず AssertionError ではないから主張が苦手ですね。 したい場合に、AssertionErrorここでは、定められているので注意が必要でと assert(false).そして誰かに読書、コードを探しておくことが出来ます。

しかも独自に定義す例外で、 CantInstantiateUtilityClass.しているという

try {
    // some stuff
} catch (CantInstantiateUtilityClass e) {
    // react
}

そのリーダーのキャッチャーを知って ました。

更新

くも気を抜かろによることdownvotesことも、ほとんど年後であること。いについてお話ししましょう注意する標準 まだ 定義 AssertionError の結果として失敗した主張ではなく、何に初心者は考え べきである スローされた場された情報ます。残念ない例外規律の中ではその少なくとも奨スキルをJavaプログラミング

コードは、明瞭に有意な改善から方法と利益を<scope>test</scope>する直進、例えばMavenのテストスコープAssertion.fail()内として依存関係としてのJUnitの包含を必要とする場合。

public final class UtilityClass {
    private UtilityClass() {
        fail("The UtilityClass methods should be accessed statically");
    }
}

場合は、テスト範囲外で、あなたは上記のように使用する静的インポートを必要とする次のようなものを使用することができます。 import static pkg.Error.fail;

public class Error {
    private static final Logger LOG = LoggerFactory.getLogger(Error.class);
    public static void fail(final String message) {
        LOG.error(message);
        throw new AssertionError(message);
        // or use your preferred exception 
        // e.g InstantiationException
    }
}

これは以下の用法ます。

public class UtilityClassTwo {
    private UtilityClassTwo() {
        Error.fail("The UtilityClass methods should be accessed statically");
    }
}

その最も慣用的な形式では、それらはすべてこれに煮詰めるます:

public class UtilityClassThree {
    private UtilityClassThree() {
        assert false : "The UtilityClass methods should be accessed statically";
    }
}

の例外に建てられた、にUnsupportedOperationExceptionをスローにすることができますの一つ 「要求された操作がサポートされていない」ことを示します。

 private Constructor() {
    throw new UnsupportedOperationException(
            "Do not instantiate this class, use statically.");
}

壊れたアサーションは、あなたのコードの契約仕様が壊れたことを意味します。だから、ここでは正しいことです。

私はあなたが個人的にインスタンスをインスタンス化することがありますと仮定して、あなたが別のコンストラクタを持っていない限り、

しかし、それはまた、コンストラクタを呼び出すと、エラー - を引き起こすのでしょうか?

自分で作ることができクラス延長 Throwable, 例えば:

class NoninstantiabilityError extends Throwable

これは、次のような特長があります。

  • の名称が示すとおり、問題
  • でに直接 Throwable 売れ筋が見える、販売戦略が決まれに巻き込まれによる事故
  • でに直接 Throwable で確認するだけなので、呼び出し、それぞれのコンストラクタによる事故なく、例外

使用例:

public final class UtilityClass {
    private UtilityClass() throws NoninstantiabilityError {
        throw new NoninstantiabilityError();
    }

    ...
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top