是否可以将函数作为枚举构造函数参数



我使用了一些无法编辑的组件,我的情况如下

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作为构造函数参数,然后在一个带有enum.accept(t)的对象上调用该getter,如下所示:

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,这不会改变。

  • 我使用的是java8,这不会改变。

  • 我想将getter与枚举相关联,它必须是构造函数参数。

因为您还没有指定CodeEntry::getButton*方法返回的类型,所以在我的示例中,我将其表示为T


您的第二个enum参数可以是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参数将是" ""+""-"

以下是使用abstract方法的解决方案:

private enum Radio {
SPACE(" ") {
@Override
public void setSelection(final CodeEntry entry, final String flag) {
// do whatever
}
},
...
public abstract void setSelection(final CodeEntry entry, final String flag);

老实说,我有点难以理解你到底想要什么,但希望这能有所帮助?

最新更新