Edited at

変数の初期化にメソッドを用いる -final付与のために-

More than 3 years have passed since last update.


特に変更されないはずの変数(*1)にはfinalを付けることで、その変数が存在するスコープ内の状態パターンが減り、デバッグ可能性や可読性が向上する。


(*1 特にImmutableクラスやプリミティブ型)

上記の理解のもとで、なるべく変数にはfinalを付与するように心がけています。

ここで、


sample1.java

//....

final int x = .....; // X は外部パラメータから取得
String t = "";
if(x == 0) t = "test";
if(x > 0) t = "sample";
if....;

System.out.println(t);


または、


sample2.java

//....

switch(x) {
case 0:
t = "test";
break;
case 1:
t = "sample";
break;
case ....:
....;
}

System.out.println(t);


上記のようなコードだと、String t に対して final を付与できません。

そこで、以下のように書き換えます。


sample1.java

// 条件が多いならメソッドに切り分けてしまう

private static String initT(int x) {
if(x == 0) return = "test";
if(x > 0) return = "sample";
if....
return "";
}
//....
final String t = initT(x);

あるいは、条件が少ないなら、三項演算子を用いて、


sample1.java

//....

final String t = (x == 0) ? "test" : (x > 0) ? "sample" : "";

このように変数の初期化を単文にすることで、 final の付与を可能にできます。


私は上記のような書き換えを意識していますが、これは推奨されないもっと良い記述がある などあれば、コメント頂ければ幸いです。