【问题标题】:Pass argumented method as parameter to enum [closed]将参数方法作为参数传递给枚举[关闭]
【发布时间】:2016-12-25 09:45:05
【问题描述】:

我的枚举有问题。我需要根据枚举值调用不同的函数,我可以根据 switch case 来做,但在我的情况下它不是一个解决方案,因为我有大约 50 个值。所以我想要做的是传递枚举构造函数中的每个函数与动态运行时值。下面是一些示例代码 sn-p 使其更清晰。

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

}

要执行此操作,我需要遍历细枚举并使用名称字段的动态值调用每个方法。

      for (TestEnum enumv : TestEnum.values()) {
        enumv.getFunstion.execute();
        }

如果是的话,是否有可能达到同样的效果,那么请告诉我最好的方法。谢谢

【问题讨论】:

  • 我不明白你的问题是什么。你的代码应该做什么,而它又做了什么?
  • 如果你想要运行时值,不要传递 runnable,创建你自己的接口,在执行方法中接受一个参数
  • 你可以在这种情况下进行多态性。看看here。维护和满足您的需求会更容易
  • 看看 Bloch,“Effective Java”第 30 条的想法。
  • name 在这段代码中应该代表什么:TEST_ENUM1("1", TestUtil.one(name))?你的Runnable 真的是Function 吗?

标签: java enums


【解决方案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 语句,并且大大提高了可读性。

【讨论】:

  • 你是用Java写的吗?如果是这样,那就大错特错了
  • @editors,你为什么要纠正一个有 3 个以上语法错误的错误答案?
  • @AndrewTobilko 这个答案有什么问题?需要详细说明吗?
  • @JBNizet,Enum,方法声明在枚举常量之前,参数/返回类型上没有类型,缺少分号......无论如何,答案没有回答问题。
  • 所以没有错。它只是有语法错误,因此有版本。这个问题仍然很不清楚,但这个答案最接近我认为OP想要做的事情。
【解决方案2】:

您可以使用 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);
    }
}

【讨论】:

    【解决方案3】:

    正如@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();
    }
    

    【讨论】:

      猜你喜欢
      • 2019-07-23
      • 1970-01-01
      • 1970-01-01
      • 2021-01-19
      • 2012-04-18
      • 2011-12-04
      • 2022-08-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多