避免java中许多if else语句的最佳方法

时间:2016-09-14 08:48:39

标签: java refactoring

我有一个方法,实现如下

public void setAttributes(Data d) {
  Model m;
  String type = d.getType();
  if (type.equals("TYPE1")) {
    m.setType(type);
    m.setDuration(d.getDuration())
    m.setBenefit(d.getBenefit())
    m.setPermission(d.getPermission());
  } else if (type.equals("TYPE2")) { /* Here we wont be having duration, benefit */
    m.setType(type);
    m.setLab(true)
  }
}

这看起来并不具有可扩展性,因为将来如果有更多的TYPES出现,那么我们需要继续添加if else块。有什么方法可以重构这个。 注意:属性将根据类型而有所不同。

4 个答案:

答案 0 :(得分:2)

您可以为每种类型创建Data的子类,并使用重写将行为分别附加到每个类。如果您计划拥有非常多的数据类型和许多相关逻辑,这是有意义的。

public abstract class Data {
    ...
    public abstract void setAttributes(Model m);
}

答案 1 :(得分:1)

考虑为可能的类型定义enum

getType()类型更改为enum

将您的if块转换为switch块,以启用该enum

使用String是一种较弱的实现技术,因为如果你理解了它,它就不是那么类型安全

答案 2 :(得分:0)

您可以使用switch

switch(type) {
    case "TYPE1":
        m.setType(type);
        m.setDuration(d.getDuration())
        m.setBenefit(d.getBenefit())
        m.setPermission(d.getPermission());
        break;
    case "TYPE2":
       m.setType(type);
       m.setLab(true)
       break;
}

这将提供更具可扩展性的模板。

答案 3 :(得分:0)

也许switch-case语句适合你(参见:https://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html

这意味着您的代码示例:

public void setAttributes(Data d) {
   Model m;
   String type = d.getType();
   switch(type) {
       case "Type1":
           m.setType(type);
           m.setDuration(d.getDuration())
           m.setBenefit(d.getBenefit())
           m.setPermission(d.getPermission());
           break;
       case "TYPE2": 
          m.setType(type);
          m.setLab(true);
          break;
  }
}

希望这有帮助