48

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

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);
    }
}

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

4

4 に答える 4

53

静的ブロックが気に入らない場合(一部の人は気に入らない)、代わりに静的メソッドを使用することもできます。IIRC、Josh Blochはこれを推奨しました(クイックインスペクションではEffective 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);
    }  
}

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

于 2009-12-08T13:20:56.820 に答える
18

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

于 2009-12-08T12:54:57.017 に答える
5

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

于 2009-12-08T12:54:15.920 に答える
3

ロンボクの注釈付きのメソッドを使用できます@SneakyThrows

public static final ObjectName OBJECT_NAME = createObjectName();

@SneakyThrows(SomeException.class)
private static ObjectName createObjectName() {
    return new ObjectName("foo:type=bar");
}

このアノテーションにより、チェックされた例外はチェックされていない例外のように動作します。

于 2020-09-12T16:02:03.890 に答える