java - 为什么不能从枚举构造函数的 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);
}
}
解决方案
lambda 表达式不是 的成员enum
,因此它不能enum
直接从 访问成员变量。它也无法访问枚举成员protected
和private
枚举成员。此外,在将 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);
}
}
推荐阅读
- numpy - How to merge very large numpy arrays?
- vba - 使 MS Word 文档“绝对”只读
- php - High Sierra Breaks FileMaker PHP 包括
- django - Django,刷新页面上的表单重新提交?
- android - 将 xxx.9.png 转换为 xxx.png
- git - 删除其他合并分支附带的分支
- perl - 通过拆分字符串填充数组
- c# - 通过 .NET API 在 Podio 中切换隐藏字段
- python - 如果网站不存在,如何仍然获得输出。(如何处理错误 404)
- python - 如何将 pd.DataFrame 对象的查询方法与标签中带有“-”连字符的列一起使用?