哪个更适合在课堂上进行多项操作?匿名内部类或者if语句在actionPerformed()中?

问题描述:

我正在制作java JFrame中的菜单。我看到了在同一个班级中对不同事件做出不同反应的两种方式。一种是使用匿名内部类是从几年前在这个答案说明: https://*.com/a/10472395/5960074哪个更适合在课堂上进行多项操作?匿名内部类或者if语句在actionPerformed()中?

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语句来跟踪事件的来源。所以有一个事件,但是代码在触发它的时候发生了变化。

第一种方法似乎凌乱,第二种方法更容易阅读。第二种方法是否有理由采用第一种方法?

谢谢。

+1

答案是,两者都不。它会降低需求。 'Action' API是另一种允许生成可重用代码块的方法 – MadProgrammer

+0

您能想到为什么其中一个会更好地工作吗?我试图设置一个这个类的菜单栏,允许用户保存和加载数据。 – admiralmattbar

+1

什么是“更好”是征求意见。应用不同的风格,并体验它们如何影响可读性以及何时从一个切换到另一个。 –

对非匿名类使用Action类(尽管它们可以是静态内部类)。它给你很好的封装,使代码可读,并且在很多方面比使用ActionListener更好。

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

假设你使用Java 8,从而可以使用拉姆达的:

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

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

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

如果您不能使用通过内部类是比实现该接口,并使用if报表更好的lambda表达式。

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()); 
} 
} 
+0

感谢您的回复。我曾经在主要方法中调用这个方法,但现在我没有,我忘记了摆脱静态。具体来说,在代码中使用静态代码有什么不好? – admiralmattbar

+1

我不认为我们在这里解释所有'static'的问题。然而,在'main'函数中写入诸如'new MyGui()。show()',并在'show()'方法中创建并显示你的gui。如果遇到问题,可能会出现一个新的SO问题。 –

+1

@admiralmattbar静态被认为是不好的做法有很多原因 - 对全局变量进行一些研究。一个问题是他们不允许写入控制,所以程序的其他部分可以改变引用,并且突然你有不可预知的行为。它们还会耦合您的核心,并降低可重用性并限制扩展 - 就像一些要点 – MadProgrammer