您的枚举等效于以下普通类(实际上,这几乎是编译器将其转换为的类):
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()为可见方法的类型。
作为元数据观察,这是强类型语言(例如Java)和“鸭子类型”语言(例如Ruby)之间的主要区别。
getFormattedPrice()不管
foo变量中包含什么类型的对象,Ruby都会很高兴地调用该方法。
作为另一个元数据观察,对于相同的不同常量
enum使用不同的集合方法没有多大意义。如果不能将所需的所有内容作为抽象(或具体)方法放在基本枚举类型上,则可能是使用了错误的工具来解决问题。



