资源描述
一般内部类、局部内部类和匿名内部类
关于非static内部类,目前我们有了三种:一般内部类(即非局部内部类)、局部内部类和匿名内部类。那么这三种内部类有什么区别呢?各自适用于什么场合呢?
匿名内部类其实是一种局部内部类,且是局部内部类的最常用用法。那么问题归结为一般内部类和匿名内部类的区别和联系。
考虑这么一种情况:有N个接口,现在需要实现用一个类来产生这N个接口的实现对象(“接口的实现”指实现接口的类)。那么用一般内部类和匿名内部类效果是相同的。
Java代码
interface Intf {}
interface Intf2 {}
......
interface IntfN {}
class NormalInnerClassDispatcher
{
class Imp implements Intf {}
class Imp2 implements Intf2 {}
......
class ImpN implements IntfN {}
//class Imp createImp (...) {return new Imp (...);}
//class Imp2 createImp2(...) {return new Imp2(...);}
//......
//class ImpN createImpN(...) {return new ImpN(...);}
}
class AnonymousInnerClassDispatcher
{
class Imp createImp () {return new Intf () {...};}
class Imp2 createImp2() {return new Intf2() {...};}
......
class ImpN createImpN() {return new IntfN() {...};}
}
interface Intf {}
interface Intf2 {}
......
interface IntfN {}
class NormalInnerClassDispatcher
{
class Imp implements Intf {}
class Imp2 implements Intf2 {}
......
class ImpN implements IntfN {}
//class Imp createImp (...) {return new Imp (...);}
//class Imp2 createImp2(...) {return new Imp2(...);}
//......
//class ImpN createImpN(...) {return new ImpN(...);}
}
class AnonymousInnerClassDispatcher
{
class Imp createImp () {return new Intf () {...};}
class Imp2 createImp2() {return new Intf2() {...};}
......
class ImpN createImpN() {return new IntfN() {...};}
}
可以看出,如果不想暴露对接口的实现(Imp, Imp2, ..., ImpN),可以用一般内部类外加constructor proxy方法实现,其实和匿名内部类是等价的,还不如匿名内部类简洁。
但是如果把N个接口换成N个基类,要求用一个类来产生这N个基类的导出类对象,那么一般内部类比匿名内部类更灵活。
Java代码
class Base {}
class Base2 {}
......
class BaseN {}
class NormalInnerClassDispatcher
{
class Ext extends Base {}
class Ext2 extends Base2 {}
......
class ExtN extends BaseN {}
//class Ext createExt (...) {return new Ext (...);}
//class Ext2 createExt2(...) {return new Ext2(...);}
//......
//class ExtN createExtN(...) {return new ExtN(...);}
}
class AnonymousInnerClassDispatcher
{
class Ext createExt (...) {return new Base () {...};}
class Ext2 createExt2(...) {return new Base2() {...};}
......
class ExtN createExtN(...) {return new BaseN() {...};}
}
class Base {}
class Base2 {}
......
class BaseN {}
class NormalInnerClassDispatcher
{
class Ext extends Base {}
class Ext2 extends Base2 {}
......
class ExtN extends BaseN {}
//class Ext createExt (...) {return new Ext (...);}
//class Ext2 createExt2(...) {return new Ext2(...);}
//......
//class ExtN createExtN(...) {return new ExtN(...);}
}
class AnonymousInnerClassDispatcher
{
class Ext createExt (...) {return new Base () {...};}
class Ext2 createExt2(...) {return new Base2() {...};}
......
class ExtN createExtN(...) {return new BaseN() {...};}
}
为什么这么说呢?在[#0x0014]里说过,由于匿名内部类没有构造器,所以匿名内部类只能产生一个或多个相同的接口实现对象或是导出类对象。
由于接口不存在构造器这么一说,所以在返回接口实现对象时,匿名内部类和一般内部类的功能是一样的,还有简洁的优势。
但当返回导出类对象时,而一般内部类不管是直接使用OuterObj.new还是使用constructor proxy方法,都可以灵活地使用调用导出类的构造器来产生多个不同的导出类对象。
展开阅读全文