哪个更适合在课堂上进行多项操作?匿名内部类或者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语句来跟踪事件的来源。所以有一个事件,但是代码在触发它的时候发生了变化。
第一种方法似乎凌乱,第二种方法更容易阅读。第二种方法是否有理由采用第一种方法?
谢谢。
首先,避免使用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());
}
}
感谢您的回复。我曾经在主要方法中调用这个方法,但现在我没有,我忘记了摆脱静态。具体来说,在代码中使用静态代码有什么不好? – admiralmattbar
我不认为我们在这里解释所有'static'的问题。然而,在'main'函数中写入诸如'new MyGui()。show()',并在'show()'方法中创建并显示你的gui。如果遇到问题,可能会出现一个新的SO问题。 –
@admiralmattbar静态被认为是不好的做法有很多原因 - 对全局变量进行一些研究。一个问题是他们不允许写入控制,所以程序的其他部分可以改变引用,并且突然你有不可预知的行为。它们还会耦合您的核心,并降低可重用性并限制扩展 - 就像一些要点 – MadProgrammer
答案是,两者都不。它会降低需求。 'Action' API是另一种允许生成可重用代码块的方法 – MadProgrammer
您能想到为什么其中一个会更好地工作吗?我试图设置一个这个类的菜单栏,允许用户保存和加载数据。 – admiralmattbar
什么是“更好”是征求意见。应用不同的风格,并体验它们如何影响可读性以及何时从一个切换到另一个。 –