15

私は列挙型(引数のために言う)を持ってCarModelおり、アプリケーション全体(多数のクラス)で使用されます。

public enum CarModel {
    DIABLO,
    P911,
    DB7;
}

この列挙型をさまざまな方法で使用するさまざまなメソッドがあり、それぞれに、他の処理を実行する前に、列挙型に応じてCarModelいくつかの変数を設定するswitchステートメントがあります。String(たとえば、モデルの製造元を設定したり、原産国を設定したりします。これらの結果は実行時に静的です)

問題は、列挙型に新しいモデルを追加する場合は、各メソッドに移動し、その存在を処理するためにswitchステートメントを拡張/変更する必要があるということです。これは、人為的エラーやコードの重複(さまざまなメソッドが同じswitchステートメントを使用する場合)につながる可能性があります。

全体的にswitchステートメントを使用するのではなく、単一の場所で編集でき、次のような動作を可能にする静的メソッドが必要です。

String country = CarModel.DIABLO.getCountry() // returns Italy
String manufacturer = CarModel.P911.getManufacturer() // returns  Porsche

これは列挙型で可能ですか(そして列挙型はこれを行うための「正しい」方法ですらありますか?

4

7 に答える 7

28

このようなことができます。

public enum CarModel {
    DIABLO("Lamborghini", "Italy"),
    P911("Porsche", "Germany");

    private String manufacturer;
    private String country;

    private CarModel(String manufacturer, String country) {
        this.manufacturer = manufacturer;
        this.country = country;
    }

    public String getManufacturer() {
        return manufacturer;
    }

    public String getCountry() {
        return country;
    }
}
于 2012-07-24T12:00:20.277 に答える
7

そのとおり。列挙型は独自のメソッドを持つことができ、それらのメソッドは値固有にすることができます。次のようになります。

enum CarModel {
    P911 {
        public String getManufacturer() { return "Porsche"; }
    },
    DB7 {
        public String getManufacturer() { return "Aston Martin"; }
    },
    ...
    public abstract String getManufacturer();
}

もちろん、さらにメソッドを追加することもできます。

于 2012-07-24T12:01:17.197 に答える
3

列挙型を使用する場合は、列挙型で宣言された抽象メソッドを提案し、次に列挙型インスタンスごとに実装を提供することをお勧めします。

そうすれば、どこにでも switch ステートメントがなく (ケースを簡単に省略できます)、より信頼性の高いオブジェクト指向スタイルのポリモーフィックアプローチが得られます。

abstract public int getEngineSize();

DIABLO {
   public int getEngineSize() {
      return 6.3; // whatever it really is...
   }
}

その他の例/ディスカッションなどについては、こちらを参照してください。

于 2012-07-24T12:00:02.920 に答える
2

この情報を列挙型に直接追加することをお勧めします。

このような:

public enum CarModel {

    DIABLO("Lambo"),
    P911 ("Porsche");

    private String manufacturer;


    private CarModel(String manufacturer) {
        this.manufacturer = manufacturer;
    }

    public String getManufacturer() {
        return manufacturer;
    }    
}

クラスでは、getManufacturerメソッドを使用するだけで済みます。

于 2012-07-24T12:03:50.793 に答える
1

ハハ、「ファクトリ」デザインパターンを使用することをお勧めします。

CarFactory()を作成して、新しいモデルの車を作成できます。

http://en.wikipedia.org/wiki/Factory_method_pattern

于 2012-07-24T12:11:32.870 に答える
1

Moreover enums can implement an interface. You can add some get() methods like getMaxSpeed() or getWeight(). Interface can look like

interface car{
public int getMaxSpeed();
public int getWeight();
}
于 2012-07-24T11:59:39.773 に答える
1

はい、これは非常に簡単です。

public enum CarModel {
    DIABLO("rod"),
    P911("jane"),
    DB7("freddy");

    private String name;
    CarModel(String name){
        this.name = name;
    }

    public String getName() {
        return name;
    }
}   
于 2012-07-24T12:01:21.000 に答える