第18条:优先考虑静态成员类
嵌套类(nested class)是指被定义在另一类的内部的类,它只为它的外围类服务。如果一个嵌套类可能会用于其它的某个环境,那就应为一个顶层类(top-level class)。嵌套类有四种:静态成员类(static member class)、非静态成员类(nonstatic member class)、匿名类(anonymous class)和局部类(local class),其中后三种称为内部类(inner class)。
静态成员类是一种最简单的嵌套类,最后把它看作一个普通的类,碰巧被声明在另一个类的内部而已,它可以访问外围类的所有成员,包括那些声明为私有的成员。静态成员类是外围类的一个静态成员,与其他的静态成员一样,遵守同样的可访问性规则。如果它被声明为私有的,则只能在外围类的内部才可以被访问。静态成员类的一种通常用法是作为公有的辅助类,仅当它与它的外部类一起使用时才有意义。
从语法上,非静态成员类与静态成员类的差别在于后者有一个static。非静态成员类的每一个实例,都隐含着与外围类的一个外围实例紧密联系在一起。在非静态成员类的实例方法内部,调用外围实例上的方法是可能的,或者使用一个经过修饰的this也可以得到个指向外围实例的引用。在没有外围实例的情况下,要想创建非静态成员类的实例是不可能的。非静态成员类的一种通常用法是定义一个Adapter,它允许外部类的一个实例被看作另一个不相关的类的实例。如Map接口的实现往往使用非静态成员类来实现它们的“集合”视图,这些“集合”视图是由Map的keySet、entrySet、Value方法返回。再看Set集合接口实现迭代器的例子:
//Typical use of a nonstatic member class
public class MySet extends AbstractSet{
// bulk of the class omitted
public Iterator interator(){
return new MyIterator();
}
private class MyIterator implements Iterator{
...
}
}
如果声明的成员类不要求访问外围实例,那么就把static修饰符放到成员类的声明中。这会减少维护成员类实例对外围实例对象的引用的开销。
私有静态成员类的一种通常用法是用来代表外围类对象的组件。例如:Map实例把一些Key和Value关联起来,其内部通常有一个Entry对象对应于每个键值对。每个Entry对象都与一个Map对象关联,但Entry的方法(getKey、getValue、setValue)都不需要外围的Map。此时,用私有的静态成员类是最佳选择。
匿名类没有名字,它不是外围类的一个成员。它并不与其它的成员一起被声明,而在被使用的点上同时声明和被实例化。匿名类可以出现在代码中任何允许表达式出现的地方。匿名类的行为与成员类非常类似,具体取决于它所在环境:如果匿名类出现在一个非静态的环境中,则它有一个外围实例。
匿名类的适用性有一些限制:
- 匿名类只能被用在代码中它将被实例化的那个点上。
- 它没有名字,实例化后不能 再 对它进行引用
- 匿名通常只实现了其接口或者超类中方法,不会声明新的方法,因为没有访问新方法的途径。
- 因为匿名类出现于表达中,故它们应该非常短(20行或更少),以增强程序的可读性
匿名类的常见用法:
-
匿名类的一通常用法是创建一个函数对象(function object),如:
//typical use of an anonymous class
//Arrays.sort(args,new comparator(){
public int compare(Object o1,Object o2){
return ((String)o1).length()-((String)o2).length();
}
});
- 另一个常见用法是创建一个过程对象(process object),如Thread、Runnable、TimerTasker实例。
- 在一个静态工厂方法的内部(参见第16条)
- 用在复杂的类型安全枚举类型(它要求为每个实例提供单独的子类)
例子:
//typical use of a public static member class
public class Calculator{
public static abstract class Operation{
private final String name;
Operation(String name){ this.name=name;}
public String toString(){ return this.name};
//perform arithmetic op represented by this constant
abstract double eval(double x,double y);
//doubly nested anonymous classes
public static final Operation PLUS = new Operation("+"){
double eval(double x,double y){return x+y;}
}
public static final Operation MINUS= new Operation("-"){
double eval(double x,double y){return x-y;}
}
public static final Operation TIMES= new Operation("*"){
double eval(double x,double y){return x*y;}
}
public static final Operation DIVIDE=new Operation("/"){
double eval(double x,double y){return x/y;}
}
}
//Return hte results of the specified calculation
public double calculate(double x,Operation op,double y){
return op.eval(x,y);
}
}
局部类是四种嵌套类中最少使用的类。在任何“可以声明局部变量”的地方,都可以声明局部类。与成员类一样,局部类有名字,可以被重复使用。与匿名类一样,当且仅当局部类被用于非静态环境下的进修,它们才有外围实例。与匿名类一样,它必须非简短,以不会损害外围方法或者初始化器的可读性。
总之,如果一个嵌套类需要在单个方法之外仍是可见的,或者它太长了,不适合于放在一个方法内部,则应该使用成员类。如果成员类的每个实例都需要一个指向其外围的实例的引用,则把成员类做成非静态的;否则做成静态的。假设一个嵌套类属于一方法的内部,如果只需要在一个地方创建它的实例,并且已经有了一个预先存在的类型可以说明这个类的特征,则把它做成匿名类;否则变成局部类。
分享到:
相关推荐
《Effective Java》是Java编程领域的一本经典著作,由Joshua Bloch撰写,该书的第三版继续提供了关于如何编写高效、优雅、可维护的Java代码的指导。以下是基于给出的目录和部分内容提取的一些关键知识点: ### 第一...
读书笔记:读Effective Java中文版第3版阅读源码测试案列
总的来说,《Effective Enterprise Java》中文版是一本值得每一个Java开发者阅读的书籍,它不仅提供了丰富的编程技巧,还强调了代码的可读性和可维护性,对于提升个人技能和团队开发效率都有极大的帮助。通过深入...
标题《effective-java.pdf》表明本文档是关于Java编程语言的实践指南,而描述说明了这是一份根据网上资源翻译后的HTML版本,经过转换形成的PDF文件,其内容可供参考。标签“java”指明文档内容与Java编程语言紧密...
"Effective Java读书笔记" Effective Java是一本关于Java编程语言的经典书籍,本笔记主要总结了Java语言的发展历程、静态工厂方法的应用、构造器模式的使用等重要知识点。 一、Java语言的发展历程 Java语言的发展...
读书笔记:Effective Java中文版第3版笔记
读书笔记:Effective Java中文版 第2版
读书笔记:Effective Java中文版学习项目
读书笔记:Effective Java中文版第二版示例代码
读书笔记:Effective Java 中文版(2版和3版)
读书笔记:Effective Java中文版第二版示例、笔记
《Effective Java》是Java开发领域的经典著作,作者Joshua Bloch深入浅出地阐述了编写高效、健壮的Java代码的技巧和最佳实践。以下是对该书部分内容的详细解释: 1. **产生和销毁对象** - Item1:静态工厂方法相比...
"Effective Java 读书分享" 《Effective Java》读书分享.pptx 是一本 Java 编程语言指南,旨在帮助开发者编写高质量、可维护的 Java 代码。该书包含 90 个条目,每个条目讨论一条规则,涵盖了 Java 编程语言的...
读书笔记:Effective Java 中文版(第2版)总结 (美)Joshua Bloch 著
《Effective Enterprise Java》是一本由James Gosling、Bill Venners和Cay S. Horstmann合著的经典著作,旨在帮助Java开发者深入理解和利用企业级Java技术。这本书提供了78条具体的建议,涵盖了从设计模式到并发编程...
《Effective Java》是Java开发领域的经典著作,由Joshua Bloch撰写,中文版第二版更是深受广大Java开发者喜爱。这本书提供了许多实用的编程实践和经验教训,帮助开发者编写出更高效、可维护的Java代码。这里我们将...
《Effective Java》是Java编程领域的一本经典著作,由Joshua Bloch撰写,现在已经更新到第三版。这本书深入探讨了如何编写高效、可维护且设计良好的Java代码,是每一个Java开发者提升技能的重要参考资料。以下是对该...
《Effective Java》是一本经典Java编程指南,作者是Joshua Bloch,这本书深入探讨了如何编写高质量、高效、可维护的Java代码。以下是对压缩包中各章节主要知识点的详细阐述: 1. **第2章 创建和销毁对象** - 单例...