java - 是否可以将函数作为枚举构造函数参数?
问题描述
我正在使用一些我无法编辑的组件,我的情况是这样的
private enum Radio {
SPACE(" "),
PLUS("+"),
MINUS("-");
private String value;
private Radio(final String value) {
this.value = value;
}
public static void setSelection(final CodeEntry entry, final String flag) {
entry.getButtonWhite().setSelection(flag.equals(SPACE.value));
entry.getButtonGreen().setSelection(flag.equals(PLUS.value));
entry.getButtonRed().setSelection(flag.equals(MINUS.value));
}
}
我不喜欢这个。我想将按钮与枚举相关联。至少可以说,其他任何事情都低于标准。但我不知道如何
private enum Radio {
SPACE(" ", CodeEntry::getButtonWhite),
PLUS("+", CodeEntry::getButtonGreen),
MINUS("-", CodeEntry::getButtonRed);
...
static reference to the non-static method getButtonWhite()
我想要的是一种accept(T t)
东西。所以我给了一个 getter 作为构造函数参数,然后我在一个带有 的对象上调用这个 getter enum.accept(t)
,如下所示:
private enum Radio {
SPACE(" ", CodeEntry::getButtonWhite),
PLUS("+", CodeEntry::getButtonGreen),
MINUS("-", CodeEntry::getButtonRed);
setSelection(final CodeEntry entry, final String flag) {
// Button button = Radio.valueOf(flag).accept(entry);
// button.setSelection(true);
Radio.valueOf(flag).accept(entry).setSelection(true);
}
我不确定这是否可行,而且语法有点让我失望。
我的例子的局限性
虽然我很欣赏任何可行的答案,但以下事情我无法改变,所以我只会接受一个勾选以下内容的答案:
标志是字符串,无论如何都会是字符串。
条目将有 getButtonX,不会改变。
我正在使用 java 8,这不会改变。
我想将 getter 与枚举相关联,它必须是构造函数参数。
解决方案
因为您没有指定CodeEntry::getButton*
方法返回的类型,所以我将在T
我的示例中表示它。
您的第二个enum
参数可以是 a Function<CodeEntry, T>
,这将允许您使用方法引用:
private enum Radio {
SPACE(" ", CodeEntry::getButtonWhite),
PLUS("+", CodeEntry::getButtonGreen),
MINUS("-", CodeEntry::getButtonRed);
private final String value;
private final Function<CodeEntry, T> buttonFunction;
private Radio(final String value, Function<CodeEntry, T> buttonFunction) {
this.value = value;
this.buttonFunction = buttonFunction;
}
public static void setSelection(final CodeEntry entry, final String flag) {
Arrays.stream(values())
.filter(radio -> flag.equals(radio.value))
.findAny()
.ifPresent(radio -> {
radio.buttonFunction.apply(entry).setSelection(true);
});
}
}
这假定flag
参数将是" "
、"+"
或"-"
。
推荐阅读
- azure - 如何确保仅存储聚合信息的消费者事件中心的幂等性?
- angular - @ViewChildren 获得未定义的值
- javascript - AJAX 获取,获得相同的功能
- node.js - 将 Sequelize CLI 与 ESM 包一起使用
- python - 如何在kivy中使我的边框图像的角更圆
- python - pymongo.errors.OperationFailure:在 Heroku 上部署聊天机器人时身份验证失败
- python - 为什么我的 psycopg2 不能与 python3 一起使用?
- c++ - 在 C++ 中精确浮点的字符串?
- python - 从 DataFrame 创建字典
- hashicorp-vault - hashcorp vault - 无法使用 API 列出机密,但可以使用 CLI 成功验证