疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

包含抽象方法的枚举类(Java)


 

 
假设有一个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关键字),但是因为枚举类需要显示创建枚举值,而不是作为父类,所以定义每个枚举值时必须为抽象方法提供实现,否则将出现编译错误。