繁体   English   中英

单身人士,Enums和匿名内部课程

[英]Singletons, Enums and anonymous inner classes

您可能知道,有些人使用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的一个实例声明一个接口。


编辑:

似乎枚举实例是一种特殊的匿名类。 因此,我理解为什么你不能称之为该方法。

我的问题有点与: 为什么匿名类不能实现一个接口 (除了它可能已经实现的接口!)

我完全理解为什么我们不能这样做:

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子项。

所以我的问题是:有什么理由说明这是不可能的吗? 或者它还没有完成?

你的枚举相当于下面的普通类(事实上,这几乎是编译器把它变成了什么):

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)之间的关键区别。 无论foo变量中包含什么类型的对象,Ruby都会很高兴地调用getFormattedPrice()方法。

作为另一个元观察,对于具有不同集合方法的相同enum不同常量,没有多大意义。 如果您不能将所需的所有内容作为抽象(或具体)方法放在基本枚举类型上,那么您可能正在使用错误的工具来解决问题。

       public String getFormattedPrice(float input) {
        return input + " €";
    }

覆盖之外作为默认实现。 (在getPrice声明旁边。)你很高兴。

您还可以使用枚举实现接口,以定义每个人需要实现的内容。

那么具有多个实例的枚举呢?

没有这样的东西,你的例子没有证明它。 你有一个具有多个的枚举 他们都是单身人士。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM