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- 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 種類の燃料があるかもしれないことに注意してください (たとえば =)。これはエンティティであるため、データベースに永続化されることを忘れないでください。

よろしくお願いします=)

4

3 に答える 3

5

EnumSetが必要なように思えますが、確かにブール値を超えています。

これは私にフラグの多くのデザインパターンを思い出させます、そして私は最近それについて正確にSOの質問を投稿しました: オブジェクトにフラグを渡すための適切なデザインパターン

これにより、100種類の燃料を簡単にサポートできます。ただし、100種類の燃料を同時に使用する車には対応していません。しかし、それは私には完全にうまく聞こえます-そのような車を作るのは非常に難しいでしょう、そしてこれはこれをコーディングするプログラムの複雑さに完全に反映されています:)(もちろんそれが本当にすべてのトウモロコシベースの燃料をサポートしていない限り-あなたは多形パターンを好むかもしれません。)

于 2012-08-01T19:36:38.463 に答える
1

列挙型を使用する必要があります。

オブジェクトの燃料タイプを取得するイメージ。

bool を使用すると、次のようになります。

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

列挙型を使用する場合は、次のように簡単に実行できます。

Fuel fuel = myClass.GetFuelType()

(これは単なる疑似コードです;))

于 2012-08-01T19:42:30.137 に答える
1

ハイブリッドの数が少ない場合は、列挙型を使用し、別のケースとしてハイブリッドを含める方がよいと思います。そうしないと、特定の Fuel を true に設定するときに、現在 true に設定されているものを false に設定する必要があるため、面倒な方法でロジックを管理する必要があります。燃料カテゴリのセッターがあり、建設時にのみ定義するわけではないので、私はこれを言っています。

編集:使用している燃料の種類を尋ねる方法も、列挙型を支持する議論になります。

于 2012-08-01T19:42:49.720 に答える