何时使用内部类/嵌套类

定义

Java内部类都是解决只使用一次的类型,不过能力各有不同,侧重场景也不同
Java关于内部类的名称实在太乱,不得不先中英文对照一下,中文只是我比较习惯,不表示什么。

  • Nested Class, *嵌套类*. 所有在类(包括方法)内部定义的类都可以叫这个名字.
  • Static Nested Class, 静态嵌套类. 或者直接说嵌套类.
  • Inner Class/Non-static Nested Class, 内部类. 这两个英文是不同的叫法.
  • Local Class, 局部类. 在方法内定义的嵌套类,
  • Anonymous Class, 匿名类. 在方法内定义, 但没有名字的类.
  • Lambda Expression, Lambda表达式. 可以认为只用一个方法的匿名类.[Java 8]
  • Method Reference, 方法引用. 可以认为是只支持转调对应函数的Lambda表达式.[Java 8]

常见的情况

嵌套类一次只会有一个实例,基本不需要类型名。
首先, 最弱的需求。只需要一个非常简单的回调,与定义的位置关联很小。

  • 对于只需要一个函数调用的场景, 可以选择方法引用,Lambda表达式,和实现特定接口的匿名类.
  • *方法引用*的能力最弱, 所有应优先考虑, 当直接调用某个类的方法就可以解决问题时, 就应该使用它.

其次, 除了直接函数调用外, 如果需要引用局部(或成员)变量,修改调用参数等,可以使用Lambda表达式.
最后, 除了上述要求外, 当需要声明成员变量或多于一个函数时,只能使用匿名类.

很少见的情况

除了上述要求外, 需要多个实例或者需要类型名时, 才需要使用局部类.

如果, 除了上述要求外, 需要外部能访问到这个类型名时, 即它会做为接口的一部分. 或者需要在多个方法中使用, 可以使用嵌套类.
不过, 必须放弃访问方法内的局部变量以及实例成员变量.

最后, 最强大的内部类,可以访问除了方法内局部变量外的所有成员, 同时也可以被外部直接使用.

参考

http://docs.oracle.com/javase/tutorial/java/javaOO/whentouse.html

posted on 2014-12-29 13:44  Anthony-黄亮  阅读(365)  评论(0编辑  收藏  举报

导航