当前位置: 首页 > 知识库问答 >
问题:

用更通用的方式替换elseif

杨凯旋
2023-03-14

我有一段代码:

@Override
public void inform(String data) {
    if (data.equals(C.SubscriptionEvents.WINDOW_CLOSED)) {
        File tempFolder = new File("temp");
        File[] files = tempFolder.listFiles();
        if (files != null) {
            for (File f : files) f.delete();
        }
    } else if (data.equals(C.Controller.Commands.SELECT_MODE_VERTICES)) {
        MainModel.setCurrentMode(Mode.VERTICES);
        display.getInfoSection().repaint();
    } else if (data.equals(C.Controller.Commands.SELECT_MODE_LINES)) {
        MainModel.setCurrentMode(Mode.LINES);
        display.getInfoSection().repaint();
    } else if (data.equals(C.Controller.Commands.SELECT_MODE_SECTORS)) {
        MainModel.setCurrentMode(Mode.SECTORS);
        display.getInfoSection().repaint();
    }
}

该方法获取一个字符串,该字符串是命令名称。根据名称,它执行指定的行为。如您所见,它开始有太多的elseifs(并且可能会有更多)。此方法属于在包之间共享的接口,因此我决定将参数设置为字符串。有没有更好的方法来避免在有很多命令时方法很大(这也包括开关大小写)?

共有3个答案

通京
2023-03-14

如果使用< code>Enum而不是< code >会怎么样...否则?:

enum Event {
    NULL(null, context -> { }),
    WINDOWS_CLOSE(C.SubscriptionEvents.WINDOW_CLOSED, context -> {
        File tempFolder = new File("temp");
        File[] files = tempFolder.listFiles();
        if (files != null) {
            for (File f : files) f.delete();
        }
    }),
    SELECT_MODE_VERTICES(C.Controller.Commands.SELECT_MODE_VERTICES, context -> {
        MainModel.setCurrentMode(Mode.VERTICES);
        display.getInfoSection().repaint();
    }),
    SELECT_MODE_LINES(C.Controller.Commands.SELECT_MODE_VERTICES, context -> {
        MainModel.setCurrentMode(Mode.LINES);
        display.getInfoSection().repaint();
    }),
    SELECT_MODE_SECTORS(C.Controller.Commands.SELECT_MODE_SECTORS, context -> {
        MainModel.setCurrentMode(Mode.SECTORS);
        display.getInfoSection().repaint();
    });

    private final String id;
    private final Consumer<Foo> consumer;

    Event(String id, Consumer<Foo> consumer) {
        this.id = id;
        this.consumer = consumer;
    }

    public final void accept(Foo context) {
        consumer.accept(context);
    }

    public static Event selectEvent(String data) {
        for (Event event : values())
            if (event.id.equals(data))
                return event;
        return NULL;
    }
}

你的代码将看起来像这样:

Event.selectEvent(data).accept(this);
束新
2023-03-14

您可以使用枚举类,如下所示:

public enum Command {
    WINDOW_CLOSED { //C.SubscriptionEvents.WINDOW_CLOSED
        public void invoke() {
            File tempFolder = new File("temp");
            File[] files = tempFolder.listFiles();
            if (files != null) {
                for (File f : files) f.delete();
            }
        }
    }
    ,SELECT_MODE_VERTICES { // C.Controller.Commands.SELECT_MODE_VERTICES
        public void invoke() {
            MainModel.setCurrentMode(Mode.VERTICES);
            display.getInfoSection().repaint();
        }
    }
    ,SELECT_MODE_LINES { // C.Controller.Commands.SELECT_MODE_LINES
        public void invoke() {
            MainModel.setCurrentMode(Mode.LINES);
            display.getInfoSection().repaint();
        }
    }
    ,SELECT_MODE_SECTORS { // C.Controller.Commands.SELECT_MODE_SECTORS
        public void invoke() {
            MainModel.setCurrentMode(Mode.SECTORS);
            display.getInfoSection().repaint();
        }
    }
    ;
    public abstract void invoke();
}

然后将上面函数的核心替换为:

@Override
public void inform(String data) {
    Command.valueOf(data).invoke();
}

“enum”值的名称必须与您在原始代码中测试的各种内容的字符串值完全匹配(例如C.SubscriptionEvents.WINDOW_CLOSED,C.SubscriptionEvents.WINDOW_CLOSED)

凤财
2023-03-14

您可以检查命令模式https://www.baeldung.com/java-command-pattern但它可能需要相当广泛的重构并使方法通知()接受命令类型的对象

 类似资料:
  • 如何一次执行所有的< code>str.replace?

  • 问题内容: 我正在尝试编写SQL更新,以使用新字符串替换特定的xml节点: 以便 变成 这种类型的请求缺少语法吗? 问题答案: 更新:MySQL 8.0具有功能REGEX_REPLACE()。 以下是我2014年的回答,该回答仍然适用于8.0之前的任何版本的MySQL: REPLACE()不支持通配符,模式,正则表达式等。REPLACE()仅将一个常量字符串替换为另一个常量字符串。 您可以尝试一些

  • 问题内容: 假设我的格式如下: 我想将小数点替换为空白,使其看起来像这样: 我该怎么做呢?我以为可以解决问题,但是当我尝试这样时: 我收到了一个错误消息,因为它可能不是字符。那是有道理的,那么我还能怎么完成我想要的? 问题答案: 如果您只是将单引号换成双引号,那么这将起作用,因为空字符串是合法值,而不是“空字符”,并且有重载。请记住,这是的超类型。

  • 问题内容: replace方法返回一个字符串对象而不是替换给定字符串的内容这一事实有点让人费解(但是,当您知道字符串在Java中是不可变的时,这是可以理解的)。通过在某些代码中使用深度嵌套的替换,我的性能受到了重大影响。有什么我可以替换的东西可以使它更快吗? 问题答案: 这就是StringBuilder的目的。如果要进行很多操作,请在上进行操作,然后在需要时将其转换为。 因此描述: “可变的字符序

  • 本文向大家介绍使用Numpy对特征中的异常值进行替换及条件替换方式,包括了使用Numpy对特征中的异常值进行替换及条件替换方式的使用技巧和注意事项,需要的朋友参考一下 原始数据为Excel文件,由传感器获得,通过Pyhton xlrd模块读入,读入后为数组形式,由于其存在部分异常值和缺失值,所以便利用Numpy对其中的异常值进行替换或条件替换。 1. 将'nan'替换为给定值 2. 按列进行条件替

  • 我有一个包含错误列表的集合。我想通过一个键(UUID UserId)对它们进行分组。为此,我从以下答案中复制了代码:https://stackoverflow.com/a/30202075/4045364 Sonar Lint告诉我以下错误: 用方法引用替换此lambda<代码>- 我所尝试的: 基于这些问题:SONAR:用方法引用替换此lambda,可运行接口:用方法引用替换此lambda。(未