3

私のプロジェクトには、静的な初期化ブロックを好む開発者がいました。これに代わるものは何ですか?この代替案の欠点は何ですか?

public class BlockTest {
    String test = new String();

    static{
        test = "test string";
    }
}

私が理解している限り、静的初期化ブロックは、1 行で実行できない場合に静的フィールドの値を設定するために使用されます。しかし、そのために特別なブロックが必要な理由がわかりません。これにより、可読性が低下し、混乱が生じます。

4

5 に答える 5

3

例えが良くない。まず第一に、それはコンパイルされません。静的 init ブロックからインスタンス変数を割り当てることはできません。でももしそれが正しかったとしても

public class BlockTest {
    static String test = new String();

    static{
        test = "test string";
    }

と同等であるため、意味がありません。

public class BlockTest {
    static String test = "test string";

しかし、この静的初期化ブロックには代替手段がありません

public class Object {

    private static native void registerNatives();
    static {
        registerNatives();
    }
...
于 2013-08-07T07:32:53.427 に答える
2

クラスのインスタンスが作成される前であっても、クラスが初めて参照されるときに実行する必要があるすべてのタスクを実行するために使用できます。さまざまなメソッドを呼び出したり、静的メンバーを初期化したりすることができます。静的ブロックにより、これらのアクティビティがクラスの存続期間中に 1 回だけ実行され、クラスに関して他の操作が行われる前に実行されることが保証されます。
プログラマーは、ブロックが一度だけ実行され、そのクラスに関連する他のアクティビティが実行される前に実行されることが保証されているため、静的ブロックに依存できます。

さらに、それが読みやすさをまったく妨げているとは思いません。また人によって違うかもしれません。

于 2013-08-07T07:31:30.593 に答える
1

クラスに長い処理が必要なメンバーがある場合、初期化子 (コンストラクター)staticを回避できません。static結局、これらはどこかで初期化する必要があります。クラスのコンストラクターでそれを行うこともできますが、新しいオブジェクトを作成するたびにこれらの値を再初期化することになります。
単純な初期化以上のものを処理する必要がある場合、実際の代替手段はありません。この投稿とこれ
を参照してください。

于 2013-08-07T07:31:33.180 に答える
0

私見、静的ブロックは必要ありません。

  String test = "test string";

そしてドキュメントから

インスタンス変数はコンストラクターで初期化でき、エラー処理やその他のロジックを使用できます。クラス変数に同じ機能を提供するために、Java プログラミング言語には静的初期化ブロックが含まれています。

しかし

: クラス定義の先頭でフィールドを宣言する必要はありませんが、これが最も一般的な方法です。使用する前に宣言して初期化するだけで十分です。

于 2013-08-07T07:32:12.627 に答える
0

単純な割り当てがある場合は、メンバー宣言で直接割り当てを行うことができます。複雑さと可読性を拡張するだけの別のブロックは必要ありません。

別の方法は、遅延初期化を使用することです。利点は、任意の複合体にすることもできますが、実際に必要な場合にのみ実行されることです。もちろん、これはクラスにゲッターがある場合にのみ機能します。メンバーに直接アクセスすると、これは大きな変化になります。

于 2013-08-07T07:31:27.257 に答える