现在,我有一个有字段的课程。
@Entity
public class Fuel {
@Id @GeneratedValue
private Long id;
private boolean diesel;
private boolean gasoline;
private boolean etanhol;
private boolean cng;
private boolean electric;
public Fuel() {
// this form used by Hibernate
}
public List<String> getDeclaredFields() {
List<String> fieldList = new ArrayList<String>();
for(Field field : Fuel.class.getDeclaredFields()){
if(!field.getName().contains("_") && !field.getName().equals("id") && !field.getName().equals("serialVersionUID") ) {
fieldList.add(field.getName());
}
Collections.sort(fieldList);
}
return fieldList;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public boolean isDiesel() {
return diesel;
}
public void setDiesel(boolean diesel) {
this.diesel = diesel;
}
public boolean isGasoline() {
return gasoline;
}
public void setGasoline(boolean gasoline) {
this.gasoline = gasoline;
}
public boolean isEtanhol() {
return etanhol;
}
public void setEtanhol(boolean etanhol) {
this.etanhol = etanhol;
}
public boolean isCng() {
return cng;
}
public void setCng(boolean cng) {
this.cng = cng;
}
public boolean isElectric() {
return electric;
}
public void setElectric(boolean electric) {
this.electric = electric;
}
}
我认为这是有道理的,但当我问另一个问题时(可能是一个愚蠢的例子,因为只能有自动或手动变速箱)https://stackoverflow.com/questions/11747644/selectonemenu-from-declared-fields-list-in-pojo,用户建议我改用枚举。像这样:
public enum Fuel {
DIESEL("diesel"),
GASOLINE("gasoline"),
ETANHOL("etanhol"),
CNG("cng"),
ELECTRIC("electric");
private String label;
private Fuel(String label) {
this.label = label;
}
public String getLabel() {
return label;
}
}
然而,由于市场上存在混合动力车(如丰田普锐斯),父类将以这种方式实现布尔类:
private Fuel fuel = new Fuel();
如果以这种方式使用枚举列表:
private List<Fuel> fuelList = new ArrayList<Fuel>();
最佳做法是什么?请记住,我可能有100种不同的燃料(例如=)。不要忘记它是一个实体,因此持久存储在数据库中。
提前致谢=)
答案 0 :(得分:5)
听起来我觉得你想要一个EnumSet,是的,肯定超过了一堆bool。
这让我想起了很多旗帜的设计模式,我最近发布了一个SO问题:Proper design pattern for passing flags to an object
这可以轻松支持100种不同的燃料类型。然而,它不支持同时使用100种不同燃料类型的汽车。但对我来说这听起来非常好 - 构建这样的汽车非常困难,这完全反映在编码这个程序的复杂性:)(除非当然它真的只是支持所有基于玉米的燃料 - 你在其中可能更喜欢多态模式。)
答案 1 :(得分:1)
你应该绝对使用枚举。
想要获得物体燃料类型的图像。
如果你使用bool,你最终会得到这样的东西:
if (myClass.IsGasoline())
else if (myClass.IsOtherFuel())
else if
...
如果您使用枚举,则可以执行以下操作:
Fuel fuel = myClass.GetFuelType()
(这只是伪代码;))
答案 2 :(得分:1)
如果混合动力车的数量很少,我想最好使用Enums,并将混合动力车作为一个不同的案例。 否则,您将必须以一种可能很麻烦的方式管理逻辑,因为当您将某个Fuel设置为true时,您很可能也将设置为false,将当前设置为true。我这样说是因为你有燃油类别的定位器,你不仅要在施工中定义。
编辑:如何询问您使用的燃料类型的方式也是支持枚举的论据。