这个"if"声明有什么问题?

Dar*_*nce 0 java if-statement

 String letterGrade = "F"; 
if (grade >= 90) { letterGrade = "A"; }
if (grade >= 80) { letterGrade = "B"; } 
if (grade >= 70) { letterGrade = "C"; } 
if (grade >= 60) { letterGrade = "D"; }
Run Code Online (Sandbox Code Playgroud)

只是一个我无法弄清楚的硬件问题.

Roh*_*ain 10

你应该有一个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"; }
Run Code Online (Sandbox Code Playgroud)

..否则所有的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;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,对于特定等级值,您可以使用以下getValue(grade)方法获得字母等级:

Grade letterGrade = Grade.valueOf(grade);
Run Code Online (Sandbox Code Playgroud)

现在,添加新的成绩范围时,可以轻松扩展枚举.现在,如果范围是这样的枚举是行不通的- [85, 100]A.对于这一点,你可以在枚举级的值作为下限,喜欢85A.然后换回来的逻辑Grade>代替==.

可以有其他方式来形成逻辑,但这取决于具体情况.但这种方法将更易于维护.

以下是Effective Java的引用- 第50项:

字符串是枚举类型的不良替代品.正如第30项中所讨论的,枚举产生的枚举类型常量远远超过字符串.