Java枚举类型中的get()方法

Java枚举类型中的get()方法,java,enums,Java,Enums,我有一个枚举类型(比如为参数而使用的CarModel),在整个应用程序中使用(许多类) 我有各种方法以不同的方式使用这个CarModelenum类型,每个方法都有一个switch语句,根据enum类型设置一些String变量,然后再进行其他操作。(例如,设置某些型号的制造商,或设置原产国等。这些结果在运行时是静态的) 问题是,如果我想向enum添加一个新模型,我需要转到每个方法,并扩展/修改switch语句来处理它的存在。这很容易导致人为错误和/或代码重复(如果各种方法使用相同的switch语句

我有一个枚举类型(比如为参数而使用的
CarModel
),在整个应用程序中使用(许多类)

我有各种方法以不同的方式使用这个
CarModel
enum类型,每个方法都有一个switch语句,根据enum类型设置一些
String
变量,然后再进行其他操作。(例如,设置某些型号的制造商,或设置原产国等。这些结果在运行时是静态的)

问题是,如果我想向enum添加一个新模型,我需要转到每个方法,并扩展/修改switch语句来处理它的存在。这很容易导致人为错误和/或代码重复(如果各种方法使用相同的switch语句)

我希望使用静态方法,而不是全部使用switch语句,这些方法可以在单个位置进行编辑,并允许类似以下行为:

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

enum是否可以实现这一点(enum是否是实现这一点的“正确”方法?

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

interface car{
public int getMaxSpeed();
public int getWeight();
}

如果要使用enum,我建议在enum中声明一个抽象方法,然后为每个enum实例提供一个实现

这样,您就不必到处都有switch语句(您可以很容易地忽略这些情况),而且您有了一种更可靠和OO风格的方法

abstract public int getEngineSize();

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

有关更多示例/讨论等,请参见。

您可以这样做

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;
    }
}

是的,绝对正确。枚举可以有自己的方法,并且这些方法可以是特定于值的。它如下所示:

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

当然,您可以添加更多方法。

是的,这很容易做到:

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

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

    public String getName() {
        return name;
    }
}   

我建议将此信息直接添加到您的枚举中

像这样:

public enum CarModel {

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

    private String manufacturer;


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

    public String getManufacturer() {
        return manufacturer;
    }    
}

在课堂上,你只需要使用getManufacturer方法,哈哈,我建议你使用“工厂”设计模式

你可以制造一个汽车工厂()来生产新的汽车模型


@NimChimpsky:这并不奇怪,因为korgen展示的其他方法更简单,使用的代码也更少。@A.H.我想是的,它们完成了同样的事情,但这很奇怪,可读性也较差-它们有什么实际优势我没有看到吗?覆盖方法与设置参数的通常优势是:覆盖更简单详细,但允许您更改算法。例如,如果有
枚举二进制运算符
,则每个运算符都可以定义
双应用(double,double)
不同。然而,这里我们处理的是数据,因此将不同的参数传递给构造函数是完全相同的。我一直都在这样做,绝对喜欢枚举的这些特性。
public enum CarModel {

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

    private String manufacturer;


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

    public String getManufacturer() {
        return manufacturer;
    }    
}