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

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

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::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与枚举关联,它必须是构造函数参数。

lisa813328 回答:是否可以将函数作为枚举构造函数参数?

由于您尚未指定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);

老实说,我在准确了解您想要的内容时遇到了一些麻烦,但希望能有所帮助吗?

本文链接:https://www.f2er.com/3142638.html

大家都在问