我的枚举问题。我需要根据枚举值调用不同的函数我可以根据开关情况来做它但是在我的情况下它不是一个解决方案sinse我有大约50个值。所以我要做的是使用动态运行时值传递枚举构造函数中的每个函数。下面是一些示例代码片段,以使其更清晰。
JPanel panel = new JPanel();
panel.setLayout(null);
JButton button = new JButton();
button.setSize(30, 30);
button.setLocation(30, 30);
panel.add(button);
}
要执行此操作,我需要遍历精简枚举,并使用动态值为名称字段调用每个方法。
public enum TestEnum {
TEST_ENUM1("1", TestUtil.one(name)),
TEST_ENUM2("2", TestUtil.two(name));
private String display;
private Runnable function;
private static String name;
TestEnum(String number,Runnable function){
this.display = number;
this.function = function;
}
public String getDisplay() {
return display;
}
public Runnable getFunction() {
return function;
}
是否有可能实现同样的目标,请告诉我最好的方法。谢谢
答案 0 :(得分:1)
你可以在枚举中声明一个抽象方法,然后让每个后续的枚举实现给定的方法。当您在枚举上进行迭代时,每个枚举都将执行它自己的实现。
public enum MyEnum {
FirstEnum {
public void myMethod(String args) {
}
},
SecondEnum {
public void myMethod(String args) {
}
};
public abstract void myMethod(String args);
}
通过这种方式,您可以避免使用多个if -else语句和switch-case语句,并且可以大幅提高可读性。
答案 1 :(得分:0)
您可以使用command pattern执行此操作,但我不确定它是否会比使用switch
更简洁。
public class Main {
public static void main(String[] args) {
TestEnum.ONE.execute();
TestEnum.TWO.execute();
}
}
enum TestEnum {
ONE("1", new Command1()),
TWO("2", new Command2());
String name;
Command command;
TestEnum(String name, Command command) {
this.name = name;
this.command = command;
}
public void execute() {
command.execute(name);
}
}
interface Command {
void execute(String name);
}
class Command1 implements Command {
@Override
public void execute(String name) {
System.out.println("Command1: " + name);
}
}
class Command2 implements Command {
@Override
public void execute(String name) {
System.out.println("Command2: " + name);
}
}
答案 2 :(得分:0)
正如@Pavisa所说,你可以为每个枚举常量定义抽象方法和实现。
在这种情况下,这有效:
for (TestEnum enumv : TestEnum.values()) {
enumv.getFunstion.execute();
}
但是维护起来比较困难。
您可以使用多态来更灵活地实现这一目标:
public interface Action {
void doStuff();
}
然后,通过实现Action或扩展它的现有实现来重新创建代码来创建所需的功能。
对于交互和运行它,你可以这样做:
List<Action> actions = getActions();
for(Action action : actions) {
action.doStuff();
}