タイトルが言うように、正確には何が違いますか
public static String myString = "Hello World!";
と
public static String myString;
static {
myString = "Hello World";
}
構造以外に重要な違いはありますか?
タイトルが言うように、正確には何が違いますか
public static String myString = "Hello World!";
と
public static String myString;
static {
myString = "Hello World";
}
構造以外に重要な違いはありますか?
Scott Stanchfield が書いたことを続けるには、Collections.unmodifiableXXX()
安全のためにメソッドを使用できますが、Google Guava のようなライブラリはその必要性を少なくするかもしれません。検討:
public static final Map<String, String> CAPITALS;
static {
Map<String, String> map = new HashMap<>(); //Java 7.
map.put("NY", "Albany");
map.put("MD", "Annapolis");
map.put("VA", "Richmond");
map.put("CT", "Hartford");
// 46 more states
CAPITALS = Collections.unmodifiableMap(map);
}
もちろん、52 行の静的ブロックを使用すると混乱する可能性があるため、代わりに静的ブロックを取得して静的メソッドに変換することもできます。
public static final Map<String, String> CAPITALS = capitals();
private static Map<String, String> capitals() {
Map<String, String> map = new HashMap<>(); //Java 7.
map.put("NY", "Albany");
map.put("MD", "Annapolis");
map.put("VA", "Richmond");
map.put("CT", "Hartford");
// 46 more states
return Collections.unmodifiableMap(map);
}
違いはスタイルの問題です。代わりに、データベース テーブルを操作することもできます。
最初の例では、変数は同じ行で宣言および初期化されています。2番目では、変数が最初に宣言され、次に初期化されます。2 番目のケースでは、問題の初期化ブロックに到達する前に、任意の数の他の静的変数とブロックの初期化を行うことができます。このケースを考えてみましょう:
public static String myString = "Hello World!";
public static String yourString = myString;
static {
System.out.println(myString);
System.out.println(yourString);
}
対:
public static String myString ;
public static String yourString = myString;
static {
myString = "Hello World";
}
static {
System.out.println(myString);
System.out.println(yourString);
}
最初の例からの出力:
こんにちは世界 こんにちは世界
2 番目の例からの出力:
こんにちは世界 ヌル
通常、静的変数の値は、それが定義されているクラスのすべてのインスタンス (または非インスタンス) 間で共有されます。静的ブロックは、クラスが最初にロードされたときに実行されるコードのセクションです。機能的に違いはありません。