我们什么时候应该使用本地课程? 最佳实践方法?
是否有可能使它们变得抽象或静止?
任何其他避免它们的解决方案?
答案 0 :(得分:2)
来自document:
如嵌套类一节所述,嵌套类可以启用 逻辑上对仅在一个地方使用的类进行分组,增加 使用封装,创建更具可读性和可维护性 码。本地类,匿名类和lambda表达式也是 传授这些优势;但是,它们的目的是用于 更具体的情况:
本地类:如果需要创建多个类的实例,访问其构造函数或引入新的命名类型,请使用它 (因为,例如,您需要稍后调用其他方法。)
匿名类:如果您需要声明字段或其他方法,请使用它。
Lambda表达:
- 如果要封装要传递给其他代码的单个行为单元,请使用它。例如,您将使用lambda
表达式,如果您希望对每个元素执行某个操作 一个集合,一个过程完成,或一个过程
遇到错误。- 如果您需要一个简单的功能界面实例并且不适用前述条件(例如,您不需要 构造函数,命名类型,字段或其他方法)。
嵌套类:如果您的要求
,请使用它
与本地课程相似,您希望更广泛地使用该类型,并且您不需要访问本地 变量或方法参数。
如果您需要访问封闭实例的非公共字段和方法,请使用非静态嵌套类(或内部类)。 如果您不需要此访问权限,请使用静态嵌套类。
您可以在方法体,for循环或if子句中定义本地类。它们类似于Inner类,因为它们无法定义或声明任何静态成员。
它们也是非静态的,因为它们可以访问封闭块的实例成员。
还出于本地类的目的阅读此document。
答案 1 :(得分:1)
本地类很像局部变量。如果该类仅在单个方法中有用,则可以创建本地类。
它们可以被声明为抽象的,但不是静态的。正如您所料,静态方法中的本地类无法访问非静态实例字段或封闭类的方法。
如果他们正确而干净地帮助您完成任务,则没有理由避免它们。
我发现的一个用途是构建Swing菜单栏层次结构:
private JMenuBar buildMenuBar() {
class MenuAction extends AbstractAction {
private static final long serialVersionUID = 1;
@Override
public void actionPerformed(ActionEvent event) {
// Deliberately empty.
}
}
Action fileMenuAction = new MenuAction();
Action editMenuAction = new MenuAction();
Action viewMenuAction = new MenuAction();
Action helpMenuAction = new MenuAction();
localizer.configure(fileMenuAction, "menu.file");
localizer.configure(editMenuAction, "menu.edit");
localizer.configure(viewMenuAction, "menu.view");
localizer.configure(helpMenuAction, "menu.help");
JMenu fileMenu = new JMenu(fileMenuAction);
JMenu editMenu = new JMenu(editMenuAction);
JMenu viewMenu = new JMenu(viewMenuAction);
JMenu helpMenu = new JMenu(helpMenuAction);
// etc.
}
没有其他方法需要MenuAction类,所以我将它设置为buildMenuBar方法的本地。