嵌套类:静态嵌套类和非静态嵌套类

内部类在维基百科的定义为:  面向对象编程中,内部类(又叫做嵌套类)是在另一个类或者接口中进行声明的类。内部类不同于子类(subclass)。(译者注:wiki的注解有误,内部类和嵌套类并不完全等同,详见下文。)

在Java中,上面的定义可以如下示例:

public final class Clazz {
  private final class InnerClazz implements Runnable {
		public InnerClazz() {
		}

		@Override
		public void run() {
			System.out.println("Hello world");
		}
  }

  public Clazz() {
  }

  public Runnable getRunnable(){
		return new InnerClazz();
  }
}

上面这个示例除了声明了一个内部类之外,没做其他任何事情。我举这个例子是想强调嵌套类和内部类的不同,因为不是所有的程序员都理解这一点。

内部类(Inner class

上面的示例代码中声明了一个内部类“InnerClazz”。每次调用getRunnable方法的时候InnerClazz类的实例就会被创建出来。如果你在FindBugs中调试这段代码,你会看到下面这条警告信息:
SIC:应该是个静态内部类(SIC_INNER_SHOULD_BE_STATIC) 。
这个类是一个由其外部对象创建的内部类,但是它没有使用内置的指向外部对象的引用。这个引用可以使得内部类实例更大,并且可以使得外部对象的生存期尽可能长。如果可能,这个类应该被定义成静态的。

这条警告信息很明确:内部类会保留一个指向其父类的引用,因此只要InnerClazz类被引用了,其父类就不能被JVM的垃圾回收机制自动垃圾回收(内部类和其父类的引用关系是很稳固的,你可以通过内存管理这篇文章了解更多)。如果你想使用这个引用,下面这种嵌套类是非常有用的:

public final class Clazz {
	private final class InnerClazz implements Runnable {
		public InnerClazz() {
		}

		@Override
		public void run() {
		  // print the value of a member of its "parent" class
		  // it's possible because the inner class has an implicit reference
		  // on the Clazz instance
		  System.out.println(_currentNumber);
		}
	}

	 private int _currentNumber = 0;

	 public Clazz() {
	 }

	 public Runnable getRunnable() {
			_currentNumber++;
			return new InnerClazz();
	 }
}

非内部类的嵌套类(Nested but not inner class)

如果你并不需要保留Clazz实例和InnerClazz实例之间的非常稳固的引用关系,那么就将InnerClazz声明为一个静态成员类(下面的例子中的NestedNotInnerClazz类)。

public final class Clazz {
	 // static keyword is added
	static private final class NestedNotInnerClazz implements Runnable {
		public NestedNotInnerClazz() {
		}

		@Override
		public void run() {
		  System.out.println("Hello world");
		}
	}

	public Clazz() {
	}

	public Runnable getRunnable(){
		return new NestedNotInnerClazz();
	}
}

瞧瞧,多简单啊。。。

 

英文原文:Coder Friendly,翻译:ImportNew - 郑雯

译文链接: http://www.importnew.com/1153.htm

【如需转载,请在正文中标注并保留原文链接、译文链接和译者等信息,谢谢合作!】

关于作者: 郑雯

2009年北航计算机学院毕业,加入IBM CDL至今。从事过web产品测试及开发工作。目前兴趣主要在游泳和自助穷游上。

查看郑雯的更多文章 >>



相关文章

发表评论

Comment form

(*) 表示必填项

1 条评论

  1. magicshell 说道:

    有意思!

    Thumb up 0 Thumb down 0

跳到底部
返回顶部