web-dev-qa-db-ja.com

チェックされた例外をスローする静的最終フィールド初期化子を処理する方法

チェックされた例外をスローするように宣言されたイニシャライザステートメントを使用してstatic finalfieldを宣言したいというユースケースに直面しています。通常、次のようになります。

public static final ObjectName OBJECT_NAME = new ObjectName( "foo:type = bar");

私がここで抱えている問題は、ObjectNameコンストラクターがさまざまなチェック済み例外をスローする可能性があることです。これは私が気にしないためです(私の名前が有効であることがわかっているので、そうでない場合に惨めにクラッシュしても問題ありません) )。 Javaコンパイラはこれを無視することはできません(チェックされた例外であるため)。私は以下に頼りたくありません。

 public static final ObjectName OBJECT_NAME; 
 static {
 try {
 OBJECT_NAME = new ObjectName( "foo:type = bar"); 
} catch(final Exception ex){
 throw new RuntimeException( "Failed to create ObjectName instance in static block。"、ex); 
} 
} 

静的ブロックは本当に、本当に読みにくいからです。誰かがこのケースを素敵でクリーンな方法で処理する方法について提案がありますか?

38
Romain

静的ブロックが気に入らない場合(一部の人は気に入らない)、代わりに静的メソッドを使用することもできます。 IIRC、Josh Blochはこれを推奨しました(クイックインスペクションでは明らかに効果的Java)ではありません)。

public static final ObjectName OBJECT_NAME = createObjectName("foo:type=bar");

private static ObjectName createObjectName(final String name) {
    try {
        return new ObjectName(name);
    } catch (final SomeException exc) {
        throw new Error(exc);
    }  
}

または:

public static final ObjectName OBJECT_NAME = createObjectName();

private static ObjectName createObjectName() {
    try {
        return new ObjectName("foo:type=bar");
    } catch (final SomeException exc) {
        throw new Error(exc);
    }  
}

(編集:staticを割り当てる代わりに、メソッドから戻るように2番目の例を修正しました。)

50

あなたのコードは完全に有効です。読みづらいとは思いません。他の方法はそれをさらに悪化させるだけでしょう。彼らのほとんどはそれに精通していないので、彼らは初心者のために読むのが難しいだけです。コード内の要素の順序に関しては、標準の規則に従ってください。例えば。静的初期化子をコードの途中または下部全体に配置しないでください。また、それらの複数がクラス全体に分散しないようにしてください。静的宣言の後、1つを一番上に置くだけです。

17
BalusC

staticブロックは読むのが難しくありません。だから私はその解決策をお勧めします。ただし、オブジェクトを別のオブジェクトでラップすることはできます。たとえば、ObjectNameWrapperinterfaceと共有し、そのコンストラクターがObjectNameコンストラクターを呼び出すObjectName、発生するすべてのチェック済み例外を非表示にします。しかし、繰り返しになりますが、静的オプションを選択します。

5
Bozho