我正在尝试将一些值映射到应应用于这些值的函数。如果简化,我想这样做:
import java.util.function.Supplier;
public enum SomeEnum {
CASE1 ("val1", this::doAction1),
CASE2 ("val2", this::doAction1),
CASE3 ("val3", this::doAction2),
CASE4 ("val4", this::doAction2);
String value;
Supplier<String> action;
SomeEnum(String value, Supplier<String> action) {
this.value = value;
this.action = action;
}
private String doAction1() {
return this.value + "-> action1";
}
private String doAction2() {
return this.value + "-> action2";
}
}
由于'SomeEnum.this'而无法编译,因此无法从静态上下文中引用它。我无法将doAction1和doAction2设为静态,因为我需要实例中的值。
这是基于if-else / switch的解决方案:
import java.util.function.Supplier;
public enum SomeEnum {
CASE1 ("val1", SomeEnum.ACTION1),
CASE2 ("val2", SomeEnum.ACTION1),
CASE3 ("val3", SomeEnum.ACTION2),
CASE4 ("val4", SomeEnum.ACTION2);
final static boolean ACTION1 = true;
final static boolean ACTION2 = false;
String value;
Supplier<String> action;
SomeEnum(String value, boolean flag) {
this.value = value;
this.action = flag ? this::doAction1 : this::doAction2;
}
private String doAction1() {
return this.value + "-> action1";
}
private String doAction2() {
return this.value + "-> action2";
}
}
另外,我有2种以上的方法,我需要额外的枚举而不是布尔型标志,并在Constructor中切换块以映射到Function。创建该枚举是为了避免在我的旧世界中疯狂地切换开关。如果它再次出现在构造函数中,我将不会赢得任何奖金。
还有我的主要问题:如果可以在构造函数中使用非静态方法引用,为什么不能将其作为参数传递?您能否解释为什么不允许这样做
enum SomeEnum {
CASE1 (this::doAction);
Supplier<String> action;
SomeEnum(Supplier<String> action) {
this.action = action;
}
private String doAction() {
return "action";
}
}
当可以的时候
enum SomeEnum {
CASE1;
Supplier<String> action;
SomeEnum() {
this.action = this::doAction;
}
private String doAction() {
return "action";
}
}
我找到的唯一解决方案:
import java.util.function.Supplier;
public enum SomeEnum {
CASE1 ("val1", () -> SomeEnum.doAction1("val1")),
CASE2 ("val2", () -> SomeEnum.doAction1("val2")),
CASE3 ("val3", () -> SomeEnum.doAction2("val3")),
CASE4 ("val4", () -> SomeEnum.doAction2("val4"));
String value;
Supplier<String> action;
SomeEnum(String value, Supplier<String> action) {
this.value = value;
this.action = action;
}
private static String doAction1(String value) {
return value + "-> action1";
}
private static String doAction2(String value) {
return value + "-> action2";
}
}
[能否请您评估一下它是否是一个好产品。以及为什么不是这样。
[您正在尝试实施对我来说根本上是错误的事情。您知道您可以在枚举中包含抽象方法并为每个常量提供其实现吗?
枚举的接口很清楚:一种String doAction()
方法,本质上就是您作为字段使用的Supplier<String>
。
无论如何,您都将使用吸气剂来放弃这个领域,所以为什么不只提供一种方法呢?
enum SomeEnum {
CASE1("val1") {
@Override
public String doAction() {
return this.value + "-> action1";
}
},
CASE2("val2") {
@Override
public String doAction() {
return this.value + "-> action2";
}
};
String value;
SomeEnum(String value) {
this.value = value;
}
public abstract String doAction();
}