我有一个方法,实现如下
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块。有什么方法可以重构这个。 注意:属性将根据类型而有所不同。
答案 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;
}
}
希望这有帮助