首页 > 解决方案 > 是否可以将函数作为枚举构造函数参数?

问题描述

我正在使用一些我无法编​​辑的组件,我的情况是这样的

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

我不确定这是否可行,而且语法有点让我失望。

我的例子的局限性

虽然我很欣赏任何可行的答案,但以下事情我无法改变,所以我只会接受一个勾选以下内容的答案:

标签: javajava-8enums

解决方案


因为您没有指定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参数将是" ""+""-"


推荐阅读