有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么不能从枚举构造函数的lambda访问实例成员?

在下面的代码中,我试图输出一个符号的值,该符号是一个加号常量的操作实例变量

但我无法访问该变量

有什么问题吗

public enum Operation {
    PLUS("+", (x, y) -> {
        System.out.println(symbol);
        return x + y;
    }),
    MINUS("-", (x, y) -> x - y),
    TIMES("*", (x, y) -> x * y),
    DIVIDE("/", (x, y) -> x / y);

    Operation(String symbol, DoubleBinaryOperator op) {
        this.symbol = symbol;
        this.op = op;
    }

    public String getSymbol() {
        return symbol;
    }

    protected final String symbol;
    private final DoubleBinaryOperator op;

    public double apply(double x, double y) {
        return op.applyAsDouble(x, y);
    }
}


共 (1) 个答案

  1. # 1 楼答案

    lambda表达式不是enum的成员,因此无法直接从enum访问成员变量。它也无法访问enum的protectedprivate成员。此外,在lambda被传递给构造函数的地方,enum的成员变量不在范围内

    一个可能的解决方案是将symbol作为第三个参数传递给lambda表达式,但这意味着您必须使用不同于DoubleBinaryOperator的函数接口

    例如:

    interface CalculationOperation {
        double calculate(double x, double y, String symbol);
    }
    
    public enum Operation {
        PLUS("+", (x, y, symbol) -> {
            System.out.println(symbol);
            return x + y;
        }),
        MINUS("-", (x, y, symbol) -> x - y),
        TIMES("*", (x, y, symbol) -> x * y),
        DIVIDE("/", (x, y, symbol) -> x / y);
    
        Operation(String symbol, CalculationOperation op) {
            this.symbol = symbol;
            this.op = op;
        }
    
        public String getSymbol() {
            return symbol;
        }
    
        protected final String symbol;
        private final CalculationOperation op;
    
        public double apply(double x, double y) {
            return op.calculate(x, y, symbol);
        }
    }