用其他东西替换许多“else if”

时间:2017-02-03 09:12:27

标签: java if-statement

我正在使用一个ActionListener,并且还有很多if语句,以便知道按下哪个按钮并根据按钮运行一些代码。

有没有办法让代码更好?我有近10个其他if语句互相跟随,还有其他我可以用的东西吗?

代码示例:

class BtnListener implements ActionListener {   
            @Override
        public void actionPerformed(ActionEvent e) {
            if (e.getSource() == menu.getOpen()) {
                getFile();
            } else if (e.getSource() == btnPlay) {

            } else if (e.getSource() == btnQuit)) {
         }
}

感谢。

4 个答案:

答案 0 :(得分:1)

您可以使用按钮的操作命令和开关盒块:

public void actionPerformed(ActionEvent e){

switch(e.getActionCommand()) {
    case "Open":
          open();
          break;
    case "Delete":
          delete();
          break;
    default :
          break;

    }
}

当然,您必须先设置每个按钮的动作命令,例如:

openButton.setActionCommand("Open");

请注意,只有{em> JDK 7 :Strings in switch Statements

才会出现带有String个对象的开关案例

答案 1 :(得分:1)

您可以在使用侦听器之前填充Map<Object, Consumer<ActionEvent>>,例如在构造函数中,其中key为source,value为action事件的使用者。在操作中,按键获取消费者并调用它。

class BtnListener implements ActionListener {
    Map<Object, Consumer<ActionEvent>> eventsMap = new HashMap<>();

    public BtnListener() {
        eventsMap.put(menu.getOpen(), actionEvent -> this.getFile());
        eventsMap.put(btnPlay, actionEvent -> { //do something
        });
        eventsMap.put(btnQuit, actionEvent -> { //do something else
        });
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        Optional.of(e)
                .map(ActionEvent::getSource)
                .map(eventsMap::get)
                .ifPresent(
                        actionEventConsumer -> actionEventConsumer.accept(e)
                );
    }
}

答案 2 :(得分:0)

如果是梯形图,你可以转换语句而不是其他很多。

class BtnListener implements ActionListener {   
    @Override
    public void actionPerformed(ActionEvent e) {

        if (e.getSource() == menu.getOpen()) {
            getFile();
        }

        switch( e.getSource() ){

            case btnPlay:

            break;
            case btnQuit:

            break;

            default:
        }
    }
}

答案 3 :(得分:0)

避免所有“开销”的最佳方法是Lambda-Expressioned按钮。例如:

JButton b1 = new JButton("Play");
b1.addActionListener(e -> play());
...
JButton bn = new JButton("Stop");
bn.addActionListener(e -> stop()); 
...
private void play() {
   ....// playing codes
}
...
private void stop() {
   ...// stopping codes
}
...