11

どちらが好きですか、なぜですか」

String myString = null;
if(someCondition)
   myString = "something";
else
   myString = "something else";

また

String myString = "";
if(someCondition)
   myString = "something";
else
   myString = "something else";

三項 (? :) 演算子を使用できることは知っていますが、上記の 2 つについて知りたいです。

4

7 に答える 7

27

ない。代わりに、これ:

String myString;
if (someCondition)
   myString = "something";
else
   myString = "something else";

両方の選択肢で、変数は決して読み取られない値で初期化されます。それがまったく存在するという事実は誤解を招くものです。

もちろん、実際には条件演算子を使用しますが、それを除けば、上記の方がより良いオプションです。

于 2010-07-23T17:01:31.753 に答える
19

慣用的な方法は、三項/条件演算​​子 ( 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 回だけ割り当てられます。
  • 一般的に言えば、最高の、最も読みやすいコードを書くのをコンパイラに任せるべきです。
于 2010-07-23T17:01:51.617 に答える
2

初期化の手順は不要であり、将来の読者を混乱させる可能性があります。

私の個人的な意見では、この種の変数は 1 回だけ割り当てる必要があるため、finalキーワードの最適な候補です。

final String myString;
if (someCondition) {
   myString = "something";
} else {
   myString = "something else";
}

myString 定義には代入が含まれておらず (後で代入が禁止されるため)、代入後は読み取り専用になることに注意してください。これにより、堅牢なコードが得られ、意図がより明確になります。

また、単一行でもブレースを信じていることに注意してください。おそらく Perl の癖ですが、そうしないと、いつか噛み付きます。

于 2010-07-23T17:16:35.547 に答える
0
String myString = "something else";
if(someCondition) myString = "something"; // (use curly braces if you prefer)
于 2010-07-23T17:01:58.450 に答える
-2

この次のコードはどうですか、とにかく彼は何かを設定したいのです。

String myString = (someCondition)  ? "something " : "else something";

またはこれ

String myString = "else something"; 

if (someCondition)
   myString = "something";

上記の場合、someCondition が常に true であることが 90% 確実である場合。それ以外の場合は、宣言で不要なオブジェクトを作成します。達人からのコメントを期待しています。

于 2010-07-24T10:06:30.857 に答える
-2

String myString = ""プールに追加のオブジェクトを作成するため、最初のものを好みます

于 2010-07-23T17:02:15.870 に答える
-2
String mystring = null;
mystring.length() 
// Cause error

上記はnullポインタによるエラーになります。

string myString = new String();
myString.length()
// will not cause error

あとで使うのが好きですが、個人的な好みだと思います。

于 2010-07-23T17:05:14.333 に答える