4

现在,我有一个带字段的类。

@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-在-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 种不同的燃料(例如 =)。不要忘记它是一个实体,因此会保存在数据库中。

提前感谢=)

4

3 回答 3

5

在我看来,你想要一个 EnumSet,是的,绝对超过一堆布尔值。

这让我想起了很多标志的设计模式,我最近发布了一个关于这个问题的 SO 问题: Proper design pattern for passing flags to an object

这支持轻松拥有 100 种不同的燃料类型。但是,它不能轻松支持同时使用 100 种不同燃料类型的汽车。但这对我来说听起来非常好 - 制造这样一辆汽车会非常困难,这完全反映在编码的程序复杂性中:) (当然,除非它真的只是支持所有基于玉米的燃料 - 你在其中可能更喜欢多态模式。)

于 2012-08-01T19:36:38.463 回答
1

你应该明确地使用枚举。

要获取对象的燃料类型的图像。

如果你使用布尔值,你最终会得到这样的结果:

if (myClass.IsGasoline())
else if (myClass.IsOtherFuel())
else if
...

如果您使用枚举,您可以简单地执行以下操作:

Fuel fuel = myClass.GetFuelType()

(这只是伪代码;))

于 2012-08-01T19:42:30.137 回答
1

如果混合的数量很少,我想使用 Enums 会更好,并将混合作为另一种情况。否则,您将不得不以一种麻烦的方式管理逻辑,因为当您将某个 Fuel 设置为 true 时,您很可能还必须将当前设置为 true 的设置为 false。我这么说是因为您有燃料类别的设定器,而且您不仅在施工中定义。

编辑:如何询问您正在使用的燃料类型的方式也将是支持枚举的论据。

于 2012-08-01T19:42:49.720 回答