String letterGrade = "F";
if (grade >= 90) { letterGrade = "A"; }
if (grade >= 80) { letterGrade = "B"; }
if (grade >= 70) { letterGrade = "C"; }
if (grade >= 60) { letterGrade = "D"; }
私が理解できない単なるハードウェアの問題。
String letterGrade = "F";
if (grade >= 90) { letterGrade = "A"; }
if (grade >= 80) { letterGrade = "B"; }
if (grade >= 70) { letterGrade = "C"; }
if (grade >= 60) { letterGrade = "D"; }
私が理解できない単なるハードウェアの問題。
if-else if
はしごが必要です。
if (grade >= 90) { letterGrade = "A"; }
else if (grade >= 80) { letterGrade = "B"; }
else if (grade >= 70) { letterGrade = "C"; }
else if (grade >= 60) { letterGrade = "D"; }
.. そうしないと、すべてのif
ステートメントが実行されます。
そのような値のハードコーディングは避けるべきです。E
後で成績システムが変更され、あなたが の成績を提供し始めた場合を考えてみましょうgrade >= 50
。その後、コードを変更するのは悪夢です。
これを処理するより良い方法は、を使用することenum
です。これらの範囲での動作に気付く場合があります。特定の範囲内の任意の値を 10 で割ると、同じ数値が得られます。このロジックを使用して、成績の列挙を作成できます。
enum Grade {
A(9), B(8), C(7), D(6);
private final Grade[] GRADES = values();
private final int grade;
private Grade(int grade) { this.grade = grade; }
public int getGrade() { return this.grade; }
public Grade valueOf(int grade) {
for (Grade grade: GRADES) {
if (grade.getGrade() == grade / 10)
return grade;
}
return null;
}
}
次に、特定の成績値について、getValue(grade)
メソッドを使用して文字の成績を取得できます。
Grade letterGrade = Grade.valueOf(grade);
これで、新しいグレード範囲が追加されたときに列挙型を簡単に拡張できるようになりました。[85, 100]
範囲が - for のようなものである場合、この列挙型は機能しませんA
。85
そのために、 forのように、グレードの値を enum の下限として持つことができますA
。Grade
次に、の>
代わりにに戻るロジックを変更し==
ます。
ロジックを形成する方法は他にもありますが、それは状況によって異なります。しかし、このアプローチははるかに保守しやすくなります。
以下は、 Effective Java - Item 50からの引用です。
文字列は列挙型の代わりにはなりません。項目 30 で説明したように、列挙型は文字列よりもはるかに優れた列挙型定数を作成します。
すべての if ステートメントを満たす条件。if else
String letterGrade = "F";
if (grade >= 90) {
letterGrade = "A";
}
else if (grade >= 80) {
letterGrade = "B";
}
else if (grade >= 70) {
letterGrade = "C";
}
else if (grade >= 60) {
letterGrade = "D";
}else {
letterGrade="none"; //remove else it. so grade "F" remain
}
}