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

时间:2012-03-01 10:26:13

标签: java

我在java文件中有这个编码。 此代码基本上接收int值并为Object

设置char值
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 ;
}

8 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

您可以使用地图

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);
}

在现实生活中,您希望在属性值不是地图中的键时添加一些异常检查。您还可以使默认行为使用已解析的属性值作为等级,并且只有在地图中存在适当的条目时才覆盖该值。

答案 2 :(得分:2)

switch case check here声明可以避免多次if else缩进!

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语句提供更高的可读性之外,没有最佳选择。

请查看以下链接以获取更多详细信息:

答案 3 :(得分:1)

查看控制关键字switch。这将有点缓解这种编码风格。

答案 4 :(得分:1)

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

现阶段的问题:'成绩'应该是私密的。 等级可能是头等对象 你打算如何支持其他年级?说4或6?如果sidevalue返回无效值会发生什么?

答案 5 :(得分:0)

其他人提出了一些小的语法更改(这可能会有所帮助),但我认为你最好在面向对象的意义上考虑这一点,将这个逻辑封装到学生类本身,这样你只需要编写它一旦。如果您需要针对不同场景使用不同的逻辑,则可以始终使用继承并覆盖setGrade。

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; 
    }
}

答案 6 :(得分:0)

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

String sidevalue=attribute.getValue()

if(sidevalue=="1"){

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

}...

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

答案 7 :(得分:-1)

1)开始使用编码格式。建议使用 objStudent 而不是某些'st'。

2)没有使用创建 int sidevalue 。直接使用开关盒,如下所示:

switch(Integer.parseInt(attribute.getValue()))
{
  case 1:
    ----
.
.
.

依旧......

}