慣用的な方法は、三項/条件演算子 ( JLS 15.25 ) を使用することです。
String myString = (someCondition ? "something" : "something else");
if-else
ただし、どうしても必要な場合は、より詳細なステートメントを実行することもできます。
final String myString;
if(someCondition) {
myString = "something";
} else {
myString = "something else";
}
final
上記のスニペットに修飾子を追加したことに注意してください。変数へのさらなる再割り当てを計画している場合、もちろんそれはできませんfinal
。したがって、修飾子を削除しても、もちろんコードは引き続き機能します。
なぜfinal
ですか?
final
上記のスニペットの のポイントは、コンストラクトが可能なすべての実行パスで 1 回だけif-else
割り当てられることを示すことです。myString
これが提案された解決策の主なアイデアif-else
です。値をローカル変数に 1 回だけ割り当てる場合は、たとえそれがいくつかの可能性のうちの 1 つになる可能性があるとしても、それを作成しfinal
て読みやすさを向上させます。
たとえば、この「代替」提案とは対照的です。
// DON'T DO THIS! Example only!
String myString = "something else";
if (someCondition) myString = "something";
この構文では、2 回代入する可能性があるため、それ以上の再代入がなくても、ここmyString
に置くことはできませんでした。また、オリジナルまたは提案のいずれfinal
も入れることができませんでした。これが、それらが推奨されない主な理由の 1 つです。final
= null;
= "";
変数を使用する前に上書きするだけであれば、変数に値を代入しても意味がありません。可読性が損なわれ、たとえば、1 つの実行パスがこの「初期」値の上書きに失敗した場合など、潜在的にバグが隠れる可能性さえあります。
参考文献
概要
- とにかく上書きする場合は、それを行うためだけにローカル変数を「初期化」しないでください
- 初期化されていないままにしておくと、コンパイラーは、変数がまだ初期化されていない間に変数の使用を指摘することで、バグの可能性を特定するのに役立ちます。
- コードがコンパイルされると、すべての使用の前に少なくとも 1 回、変数に「実際の」値が割り当てられます。
- ローカル変数を再割り当てする必要がない場合は、
final
読みやすくするため
に作成します
final
これ以上の再割り当てが不可能であることを読者に直ちに保証します
- コンパイラは、その後の再割り当ての間違いを防ぐのに役立ちます
- コードがコンパイルされると、すべての変数が使用される前に、変数に「実際の」値が 1 回だけ割り当てられます。
- 一般的に言えば、最高の、最も読みやすいコードを書くのをコンパイラに任せるべきです。