枚举实现接口——模拟可扩展的枚举

荒凉一梦 提交于 2020-02-03 04:47:44

枚举实现接口——模拟可扩展的枚举

概要

虽然无法编写可拓展的枚举类型,却可以通过编写接口以及实现该接口的基础枚举类型来对它进行模拟。

一、带有抽象方法的枚举

public enum Operation {

    PLUS("+"){
        public double apply(double x, double y) { return x+y; }
    },
    MINUS("-"){
        @Override
        public double apply(double x, double y) {
            return x-y;
        }
    },
    TIMES("*"){
        @Override
        public double apply(double x, double y) {
            return x*y;
        }
    },
    DIVIDE("/"){
        @Override
        public double apply(double x, double y) {
            return x/y;
        }
    };

    private final String symbol;
    Operation(String symbol){
        this.symbol  = symbol;
    }

    public abstract double apply(double x, double y);

    @Override
    public String toString() {
        return this.symbol;
    }
 
 }

二、定义一个接口

将抽象方法放到接口中:

public interface Operation {
    double apply(double x, double y);
}

三、让枚举实现接口

让枚举实现接口,基础版本:

/**
 * @Date 2020/2/2
 * @Author lifei
 */
public enum BasicOperation implements Operation{

    PLUS("+"){
        @Override
        public double apply(double x, double y) {
            return x+y;
        }
    },
    MINUS("-"){
        @Override
        public double apply(double x, double y) {
            return x-y;
        }
    },
    TIMES("*"){
        @Override
        public double apply(double x, double y) {
            return x*y;
        }
    },
    DIVIDE("/"){
        @Override
        public double apply(double x, double y) {
            return x/y;
        }
    };

    private final String symbol;

    BasicOperation(String symbol){
        this.symbol = symbol;
    }

    @Override
    public String toString() {
        return this.symbol;
    }
}

扩展版本:

/**
 * @Date 2020/2/2
 * @Author lifei
 */
public enum  ExtendedOperation implements Operation{
    EXP("^"){
        @Override
        public double apply(double x, double y) {
            return Math.pow(x, y);
        }
    },
    REMAINDER("%"){
        @Override
        public double apply(double x, double y) {
            return x%y;
        }
    };

    private final String symbol;

    ExtendedOperation(String symbol){
        this.symbol = symbol;
    }

    @Override
    public String toString() {
        return this.symbol;
    }
}

四、测试枚举的两种方法

测试枚举方法一:

    private static <T extends Enum<T> & Operation> void test(Class<T> opEnumType, double x, double y){
        for (Operation operation : opEnumType.getEnumConstants()) {
            System.out.printf("%f %s %f = %f%n", x, operation, y, operation.apply(x, y));
        }
    }

测试枚举方法二:

    private static void test(Collection<? extends Operation> opSet, double x, double y){
        for (Operation op : opSet) {
            System.out.printf("%f %s %f = %f%n", x, op, y, op.apply(x, y));
        }
    }

运行测试:

    public static void main(String[] args) {
        double x = 23;
        double y = 15;
        test(BasicOperation.class, x, y);
        //test(ExtendedOperation.class, x, y);
        test(Arrays.asList(ExtendedOperation.values()), x, y);
    }
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!