首页 > 解决方案 > 为什么不能从枚举构造函数的 lambda 访问实例成员?

问题描述

在下面的代码中,我试图从 PLUS 常量中输出一个符号的值,该符号是 Operation 的实例变量。

但我无法访问该变量。

有什么问题?

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);
    }
}

标签: javalambdaenums

解决方案


lambda 表达式不是 的成员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);
    }
}

推荐阅读