在实践中使用本地课程

时间:2015-07-06 13:03:41

标签: java inner-classes nested-class

我们什么时候应该使用本地课程? 最佳实践方法?

是否有可能使它们变得抽象或静止?

任何其他避免它们的解决方案?

2 个答案:

答案 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方法的本地。