对于课堂中的多个动作哪个更好? actionPerformed()中的匿名内部类或if语句?

时间:2017-10-13 21:00:40

标签: java swing events awt

我正在制作java JFrame中的菜单。我已经看到了两种对同一班级中不同事件做出不同反应的方法。一种是使用几年前这个答案中描述的匿名内部类: https://stackoverflow.com/a/10472395/5960074

public static void createMenuBar()
{
    //Main Menu Items

    menubar.add(fileMenu);
    MainWindow.window.setJMenuBar(menubar);

    //Sub menu items
    saveItem = new JMenuItem("Save");
    loadItem = new JMenuItem("Load");

    //Add to the "File" menu item
    fileMenu.add(saveItem);
    fileMenu.add(loadItem);

    //Anonymous Inner classes for actionListeners


    //Action event for saving
    saveItem.addActionListener(new ActionListener(){ //adding the listener
        @Override
        public void actionPerformed(ActionEvent e){ //creating the specific action for save
            System.out.println("You tried to save.");
        }
    });

}

在我的代码中它看起来像这样并且它可以工作(就像此时它打印"你试图保存。"到控制台)。

我已经看到其他人在类中实现ActionListener,然后在方法actionPerformed()中使用if语句来跟踪事件的来源。所以有一个事件,但代码会改变触发它的内容。

第一种方法看起来很乱,第二种方法更容易阅读。是否有理由在第二种方法中使用第一种方法?

感谢。

2 个答案:

答案 0 :(得分:1)

Action类与非匿名类一起使用(但它们可以是静态内部类)。它为您提供了良好的封装,使代码可读,并且在许多方面比使用ActionListener更好。

答案 1 :(得分:1)

首先,避免使用static,你真的(真的)不需要它,它会促进糟糕的代码设计。

假设您使用Java 8,因此可以使用lambda:

public void createMenuBar() {
   ...
   saveItem.addActionListener(this::save);
   loadItem.addActionListener(this::load);
} 

private save(ActionEvent e) { 
    .... 
}

private load(ActionEvent e) { 
   .... 
}

如果你不能使用内部类的lambdas比实现接口和使用if语句更好。

 public class MyGui {
     private class SaveAction implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
           ....
        }
    }

     private class LoadAction implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
           ....
        }
    }

 public void createMenuBar() {
   ...
   saveItem.addActionListener(new SaveAction());
   loadItem.addActionListener(new LoadAction());
 } 
}