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)几乎一模一样。

© 2004, bigwhite. 版权所有.

Related posts:

  1. Effective Java阅读笔记-item13、14
  2. Effective Java阅读笔记-item12
  3. Effective Java阅读笔记-item4、6
  4. Effective Java阅读笔记-item1
  5. Effective Java阅读笔记-item16