您可能知道,有些人使用 Enum 为 1 个实例声明单例,因为 JVM 保证总会有一个没有并发问题需要处理的单个实例...
那么具有多个实例的 Enum 呢?我们可以说像 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); 如果不通过公共接口就不能调用公共方法,那么声明公共方法有什么好处?我想这就是为什么我看不到任何语法能够仅为枚举的一个实例声明一个接口。
编辑:
似乎枚举实例是一种特殊的匿名类。因此,我理解为什么您不能调用该方法。
我的问题有点相关:为什么匿名类不能实现接口(除了它可能已经实现的接口!)
我完全理解为什么我们不能这样做:
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 子项。
所以我的问题是:有什么理由说明这是不可能的吗?还是只是还没有完成?