第22条:优先考虑静态成员类
来源:互联网 发布:谷歌程序员面试题 编辑:程序博客网 时间:2024/06/05 06:31
嵌套类(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)。
第三种常见的用法是在静态工厂方法的内部。
如果一个嵌套类需要在单个方法之外仍然是可见的,或者他太长了,不适合方法内部,就应该使用成员类。如果成员类的每个实例都需要一个指向其外围实例的引用,就要把成员类做成非静态的;否则就做成静态的。假设这个嵌套类属于一个方法的内部,如果你需要在一个地方创建实例,并且已经有了一个预置的类型可以说明这个类的特征,就把他做成匿名类;否则,就做成局部类。
- 第22条:优先考虑静态成员类
- Effective Java 第 22 条:优先考虑静态成员类
- 第22条:优先考虑静态成员类
- 第二十二条:优先考虑静态成员类
- 第22条 类与接口——优先考虑静态成员类
- 《Effective java》读书记录-第22条-优先考虑静态成员类
- (22):优先考虑静态成员类
- 优先考虑静态成员类。
- 第22条:优先使用静态成员类
- effective java(22) 之优先考虑静态成员类
- EffectiveJava之18-优先考虑静态成员类
- 学习effective java-22类和接口之优先考虑静态成员类
- 第26条:优先考虑泛型
- 第27条:优先考虑泛型方法
- Effective Java学习--第26条:优先考虑泛型
- 第29条:优先考虑类型安全的异构容器
- 《Effective java》读书记录-第26条-优先考虑泛型
- 第27条 泛型——优先考虑泛型方法
- JavaScript中的document.cookie的使用
- 是谁把Adobe数字签名的RSL(*.swz)存放到FlashPlayer指定的缓存当中的? 是FlashPlayer
- Myeclipse9.0 正式版64位JDK 之win7下的完美破解
- 《Proof without Words》问题之一——化圆为方
- 第七周实验报告(任务2)
- 第22条:优先考虑静态成员类
- Report Service 动态设置字体、边线
- Vc6.0 调试指南
- 19.unicode在python中的运用
- Mean Shift
- Buffon投针实验 · 数学的直观理解 · 基础知识很重要
- linux_redhat9下安装DNS服务器
- 苹果系统里面 dictionary 如何加入中文词典
- 请把Camera hold住 - Android高通平台调试Camera驱动全纪录