但行好事  莫问前程

枚举系列(五):包含抽象方法的枚举类

假设有一个Operation枚举类,它的四个枚举值PLUS,MINUS,TIMES,DIVIDE分别代表加,减,承,除四种运算。为此,定义下面的Operation枚举类。

public enum Operation
{
    PLUS, MINUS, TIMES, DIVIDE;
    //为枚举类定义一个方法,用于实现不同的运算
    double eval(double x, double y)
    {
        switch(this) 
        {
            case PLUS: return x + y;
            case MINUS: return x - y;
            case TIMES: return x * y;
            case DIVIDE: return x / y;
            default: return 0;
        }
    }
    public static void main(String[] args)
    {
        System.out.println(Operation.PLUS.eval(3, 4));
        System.out.println(Operation.MINUS.eval(5, 4));
        System.out.println(Operation.TIMES.eval(5, 4));
        System.out.println(Operation.DIVIDE.eval(5, 4));
    }
}

这里枚举类基本可以运行良好,上面枚举类里的main方法分别使用了PLUS,MINUS,TIMES,DIVIDE四个枚举值进行加,减,承,除运算,程序运行完正常。

但看上面代码的default: return 0;代码行,这行代码完全没有存在的必要:因为this代表了Operation枚举类的一个值,这个值只可能是PLUS,MINUS,TIMES,DIVIDE四个值,根本没有其他的值,但我们又不能不写上面的代码,否则无法编译通过。

仔细观察上面的Operation类不难发现,PLUS,MINUS,TIMES,DIVIDE四个枚举值对eval方法各有不同的实现。为此,可以让它们分别为4个枚举值提高eval的实现,然后在Operation类中定义一个eval的抽象方法。

public enum Operation2 {
    PLUS {
        public double eval(double x, double y) {
            return x + y;
        }
    },
    MINUS {
        public double eval(double x, double y) {
            return x - y;
        }
    },
    TIMES {
        public double eval(double x, double y) {
            return x * y;
        }
    },
    DIVIDE {
        public double eval(double x, double y) {
            return x / y;
        }
    };
    // 为枚举类定义一个抽象方法,
    // 这个抽象方法由不同枚举值提供不同的实现
    public abstract double eval(double x, double y);

    public static void main(String[] args) {
        System.out.println(Operation2.PLUS.eval(3, 4));
        System.out.println(Operation2.MINUS.eval(5, 4));
        System.out.println(Operation2.TIMES.eval(5, 4));
        System.out.println(Operation2.DIVIDE.eval(5, 4));
    }
}

编译上面的程序会生成5个class文件,其实Operation2对应一个class文件,它的四个匿名内部子类分别各对应一个class文件。

枚举类里面定义抽象方法时不能使用abstract关键字将枚举类定义成抽象类(因为系统会自动为它添加abstract关键字),但是因为枚举类需要显示创建枚举值,而不是作为父类,所以定义每个枚举值时必须为抽象方法提供实现,否则将出现编译错误。

附:源代码示例

github地址:点击查看
码云地址:点击查看

打赏
欢迎关注人生设计师的微信公众账号
公众号ID:longjiazuoA

未经允许不得转载:人生设计师 » 枚举系列(五):包含抽象方法的枚举类

分享到:更多 ()

人生设计师-接受不同的声音

联系我关于我