Effective Java阅读笔记-item18
Dreamhead把他用大把银子买来的“Effective Java”借给我阅读,我真是很感动亚,我只能用行动来感谢Dreamhead了。^_^
18、优先考虑静态成员类(static member class)
在C++的应用中我们很少使用嵌套类,我只在MFC和COM组件中遇到过这些,而且这些嵌套类被隐藏在应用背后,一般的应用中则很少使用。而在Java中嵌套类的应用还是要比在C++中多些。Java中嵌套类主要之功用就是辅助其outer class,为outer class提供服务。
嵌套类分类:
- static member class:
- nonstatic member class:
- anonymous class:
- local class
按照书中的方式我们根据各种类型嵌套类的用途来说:
* static member class
基本格式:
public class OuterClass{
publc/private static class InnerClass{
//…
}
}
对于static型的member class:
多个outer class instance共享一个static member class,就是说static member class和outer类的一般静态成员地位是一样的, static member class可以访问outer class的所有成员,包括private的成员。
书中的例子:(两层嵌套,既使用了static member class又使用了anonymous classes)
//Calculator.java
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; }
};
}
// Return the results of the specified calculation
public double calculate(double x, Operation op, double y) {
return op.eval(x, y);
}
}
//CalcTest.java
public class CalcTest {
public static void main(String args[]) {
double x = Double.parseDouble(args[0]);
double y = Double.parseDouble(args[1]);
operate(x, Calculator.Operation.PLUS, y);
}
static void operate(double x, Calculator.Operation op, double y) {
Calculator c = new Calculator();
System.out.println(x + " " + op + " " + y + " = " +
c.calculate(x, op, y));
}
}
//command: java CalcTest 3 4
//output: 3.0 + 4.0 = 7.0
* nonstatic member class
基本格式:
public class OuterClass{
publc/private class InnerClass{
//…
}
}
对于non-static型的member class:
每个outer class instance都要维护一个member class的实例,且这种关系在outer class被实例化后就不变了。nonstatic member class的实例是在其outer class实例化时才有意义的。
所以当嵌套类的实例可以不依赖于其outer class的实例而存在时。我们应该使用static member class。
nonstatic member classes 常被用來定义 Adapter ,允许我们将outer class的实例视为某些不相关的类的实例。
例如:像Set和List这样的集合接口的实现往往利用nonstatic member class来实现iterator
书中例子:
public MySet extends AbstractSet{
//…
private class MyIterator implements Iterator{//inner class or nested class
}
public Iterator iterator(){
return new MyIterator();
}
}
* anonymous classes(匿名类)
匿名类不是outer class的一个成员,它在使用处被同时声明和实例化。匿名类通常只是实现了其接口或超类中的方法。它们不会声明新方法。
匿名类的用途很广泛。
- 用来创建一个function object
如代码:
Collections.sort(list, new Comparator() {
public int compare(Object o1, Object o2) {
return ((String)o1).length() – ((String)o2).length();
}
}
);
像这样的匿名类可读性差,建议不要把匿名类写的很长。
这里我们假设匿名类的名字为$,这实际上的代码可能是像这样的:
class $ implements Comparator{
public int compare(…){
//implement the compare method
}
}
Collections.sort(list, new $());
- 创建process object,例如 Thread、Runnable 实例
- 给 static factory 方法使用,可以在 static factory method 返回一份 anonymous 的实例
* local class(局部类)
使用local class把握一个原则:local class与局部变量的使用(包括声明和scope)几乎一模一样。
评论