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 语句(你可以很容易地省略 case),并且你有一个更可靠和 OO 风格的多态方法。

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

此外,枚举可以实现接口。您可以添加一些get()方法,例如getMaxSpeed()getWeight()。界面看起来像

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 回答
1

哈哈,我推荐你使用“工厂”设计模式。

你可以制作一个 CarFactory() 来生产新车型。

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

于 2012-07-24T12:11:32.870 回答