正如您所知,有些人使用Enum of 1实例声明单例,因为JVM保证总会有一个没有并发问题的实例来处理......
那么具有多个实例的枚举呢? 我们可以说像Enum这样的东西是一种有序的单身人士共享一个共同的界面吗? 为什么呢?
public enum EnumPriceType {
WITH_TAXES {
@Override
public float getPrice(float input) {
return input*1.20f;
}
public String getFormattedPrice(float input) {
return input*1.20f + " €";
}
},
WITHOUT_TAXES {
@Override
public float getPrice(float input) {
return input;
}
},
;
public abstract float getPrice(float input);
public static void main(String[] args) {
WITH_TAXES.getFormattedPrice(33f);
}
}
在此代码中,为什么这不起作用: WITH_TAXES.getFormattedPrice(33F); 如果不通过公共接口就无法调用公共方法,那么声明它的兴趣是什么? 我想这就是为什么我没有看到任何语法能够为Enum的一个实例声明一个接口。
修改
似乎enum实例是一种特殊的匿名类。 因此,我明白为什么你不能称之为那种方法。
我的问题有点与:为什么匿名类不能实现接口(除了它可能已经实现的接口之外!)
我完全理解为什么我们不能这样做:
Vehicle veh = new Vehicle() {
public String getName() {
return "toto";
}
};
veh.getName();
(这里的getName不是覆盖)
为什么我不理解为什么我们不能用匿名类来做到这一点:
Runnable veh = new Vehicle() implements Runnable {
@Override
public void run() {
System.out.println("i run!");
}
};
veh.run();
或者会导致同样事情的事情。 想想看:如果你不使用匿名类,你绝对可以扩展Vehicle类,然后让该子类实现你想要的任何其他接口......
我很确定如果有可能我们能够以类型安全的方式调用WITH_TAXES.getFormattedPrice(33f),因为WITH_TAXES不是真正的EnumPriceType但它只是EnumPriceType的子类,有自己的接口,并通过使用硬编码的WITH_TAXES调用WITH_TAXES.getFormattedPrice(33f),您在编译时知道您正在调用哪个EnumPriceType子项。
所以我的问题是:有什么理由说明这是不可能的吗?或者它还没有完成?
答案 0 :(得分:11)
你的枚举等同于下面的普通类(事实上,这几乎是编译器把它变成了什么):
public abstract class EnumPriceType {
public static final EnumPriceType WITH_TAXES = new EnumPriceType() {
//getPrice() {...}
//getFormattedPrice() {...}
};
public static final EnumPriceType WITHOUT_TAXES = new EnumPriceType() {
//getPrice() {...}
};
public abstract float getPrice(float input);
public static void main(String[] args) {
WITH_TAXES.getFormattedPrice(33f);
}
}
getFormattedPrice()
方法在抽象类型上不可用,因此无法从main方法调用。考虑如果重写main方法以使用局部变量会发生什么:
public static void main(String[] args) {
EnumPriceType foo = EnumPriceType.WITH_TAXES;
foo.getFormattedPrice(33f);
}
这不会编译,因为getFormattedPrice()
在基类上不可用。由于WITH_TAXES
实例是EnumPriceType
的匿名子类,因此您无法将局部变量定义为getFormattedPrice()
方法可见的类型。 / p>
作为元观察,这是强类型语言(如Java)和“鸭类型”语言(如Ruby)之间的关键区别。无论在getFormattedPrice()
变量中保存什么类型的对象,Ruby都会很高兴地调用foo
方法。
作为另一个元观察,对于具有不同集合方法的相同enum
的不同常量,没有多大意义。如果你不能把你需要的所有内容作为抽象(或具体)方法放在基本枚举类型上,那么你可能使用错误的工具来解决问题。
答案 1 :(得分:2)
添加
public String getFormattedPrice(float input) {
return input + " €";
}
外部覆盖作为默认实现。 (在getPrice
的声明旁边。)你很高兴。
您还可以使用枚举实现接口,以定义每个人需要实现的内容。
答案 2 :(得分:0)
那么具有多个实例的枚举呢?
没有这样的事情,你的例子没有证明它。你有一个包含多个值的枚举。他们都是单身人士。