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