第22条:优先考虑静态成员类

嵌套类(nested class)是指被定义在另一个类的内部的类。嵌套类存在的目的应该只是为他的外围类(enclosing class)提供服务。
如果嵌套类将来可能会用于其他的某个环境中,他就应该是顶层类(top-level class)。
嵌套类有四种:静态成员类(static member class)、非静态成员类(nonstatic member class)、匿名类(anonymous class)和局部类(local class)。
除了第一种之外,其他三种都称为内部类(inner class)。


从语法上讲,静态成员类和非静态成员类之间的唯一区别是,静态成员类的声明中包含修饰符static。尽管他们的语法非常相似,但是两种嵌套类有很大的不同。
非静态成员类的每个实例都隐含着与外围类的一个外围实例(enclosing instance)相关联。在非静态成员类的实例方法内部,可以调用外围实例上的方法,或者利用修改过的this构造获得外围实例的引用。
如果嵌套类的实例可以在他外围类的实力之外独立存在,这个嵌套类就必须是静态成员类:在没有外围实例的情况下,要想创建非静态成员类的实例是不可能的。
demo:

package cn.partner4java.nestedclass;

public class HelloWorld2 {
	
	public void test1(){}
	public static void test2(){}
	
	class NestedClass1{
		public NestedClass1() {
			test1();
		}
	}
	
	static class NestedClass2{
		public NestedClass2() {
			test2();
		}
	}
}



当非静态成员类的实例被创建的时候,他和外围之间的关联关系也随之被创立起来;而且,这种关联关系以后不能被修改。通常情况下,当在外围类的某个实例方法的内部调用非静态成员类的构造器时,这种关系被自动建立起来。
使用表达式enclosingInstance.new MemberClass(args)来手工建立这种关联关系也是有可能的,但是很少使用。正如你所预料的那样,这种关联关系需要消耗费静态成员类的实例空间,并且构造的时间开销。


如果声明成员类不要求访问外围实例,就要始终把static修饰符放在他的声明中。


匿名类的一种常见用法 动态的创建函数对象(function object)。
匿名类的另一种常见用法是创建过程对象(process object)。
第三种常见的用法是在静态工厂方法的内部。


如果一个嵌套类需要在单个方法之外仍然是可见的,或者他太长了,不适合方法内部,就应该使用成员类。如果成员类的每个实例都需要一个指向其外围实例的引用,就要把成员类做成非静态的;否则就做成静态的。假设这个嵌套类属于一个方法的内部,如果你需要在一个地方创建实例,并且已经有了一个预置的类型可以说明这个类的特征,就把他做成匿名类;否则,就做成局部类。                                       


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值