Java:有没有办法改进这个代码

Java : is there any way that this code can be improved

我在Java文件中有这个编码。此代码基本上接收一个int值,并为一个对象设置一个char值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Student st = new Student();

if (attributeName.equals("Grade")) {
    int sidevalue = Integer.parseInt(attribute.getValue());  // This returns an int value , and this value needs to be converted into char later as shown
    if(sidevalue==1)
        st.grade=1;
    else if(sidevalue==2)
        st.grade=2;
    else if(sidevalue==5)
        st.grade=3;
}


class Student
{
    char grade ;
}


  • 如果属性名不是数字,则Integer.parseInt抛出异常。抓住它并处理错误。
  • EDCOX1的9个类应该公开并转到一个单独的Java文件。
  • grade字段应该是int(您的通行号码)
  • 或者-如果您需要存储字符,您可能需要说st.grade = '1';(通过'1',而不是0x01)
  • grade字段应为私有字段,使用getGradesetGrade方法读取写入属性。
  • 我不理解"sidevalue"的含义——如果它在域上下文中没有众所周知的含义,那么考虑重命名它。
  • 局部变量st应改为Student
  • if-else-if链可以用switch-case语句代替。

你可以用地图

1
2
3
4
5
6
7
8
9
Map<Integer, Integer> gradeMappings = new HashMap<Integer, Integer>();
gradeMappings.put(1,1);
gradeMappings.put(2,2);
gradeMappings.put(3,5);

if (attributeName.equals("Grade")) {
    int sidevalue = Integer.parseInt(attribute.getValue());
    st.grade = gradeMappings.get(sidevalue);
}

在现实生活中,当属性值不是映射中的键时,您需要添加一些异常检查。您还可以使默认行为使用解析的属性值作为等级,并且仅当映射中存在适当的条目时才重写该值。


switchcasecheck here语句可以避免多个ifelse缩进!

1
2
3
4
5
6
7
8
9
10
switch(sidevalue){

   case 1: st.grade = 1;
            break;
   case 2: st.grade = 2;
            break;
   case 5: st.grade = 3;
            break;
   default: break;
}

if-elseswitch在运行上没有显著的执行差异。观察到的差异可能是由于正在运行的特定代码的样本空间造成的。

在您提供的小代码片段中,除了switch语句提供了改进的可读性之外,没有最佳选择。

请检查这些链接以了解更多详细信息:

  • "else if"是否比"switch()case"更快?
  • 如果是else与switch
  • 何时使用if else if else切换开关柜,反之亦然


改进此代码的最佳方法是为其编写测试。

这个阶段的问题是:"等级"应该是私有的。等级可能是第一类对象。你打算如何支持其他年级?比如说4还是6?如果SideValue返回的值无效,会发生什么情况?


查看控制关键字switch。这将在一定程度上缓解这种编码方式。


如果在attribute.getValue()中存储了规范化的字符串值,那么可以删除整数解析并简单地比较字符串值。

1
2
3
4
5
6
7
String sidevalue=attribute.getValue()

if(sidevalue=="1"){

}else if(sidevalue=="2"){

}...

有关详细信息,请参阅string.intern方法。这将有助于提高程序的性能。


其他人建议进行一些小的语法更改(这可能会有所帮助),但我认为您最好从面向对象的角度来考虑这个问题,将这个逻辑封装到学生类中,这样您只需要编写一次。如果您需要不同的逻辑用于不同的场景,您可以始终使用继承和覆盖setgrade。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Student st = new Student();
st.setGrade(Integer.parseInt(attribute.getValue()))

class Student{
    private char grade ;

    public setGrade(int sidevalue){
        if(sidevalue==1)
            grade=1;
        else if(sidevalue==2)
            grade=2;
        else if(sidevalue==5)
            grade=3;
        else
            throw new IllegalArgumentException();
    }

    public char getGrade(){
        return grade;
    }
}

1)开始使用编码格式。建议使用对象而不是某些"st"。

2)不使用创建int sidevalue。直接使用开关箱,如下所示:

1
2
3
4
5
6
7
switch(Integer.parseInt(attribute.getValue()))
{
  case 1:
    ----
.
.
.

等等…

1
}