局部类访问外部final变量
在局部类, 我们要更新封闭作用域用的变量, 这一般来说是不容易做到了. 因为局部类要访问封闭作用域的类, 要用final去修饰封闭作用域的变量.
例子: 想统计一下在排序过程中调用 compareTo方法的次数
int count = 0;Date[] dates = new Date[100];for(int i=0; i < dates.length; i++){ dates[i] = new Date(){ public int compareTo(Date other){ count++; //ERROR return super.compareTo(other); } };}
final int[] counter = new int[1];for(int i=0; i<dates.length; i++){ dates[i] = new Date(){ public int compareTo(){ counter[0]++; return super.compareTo(other); } };}
/** * 外部类 */class TalkingClock{private int interval;private boolean beep; public TalkingClock(int interval, boolean beep){this.interval = interval;this.beep = beep;}public void start(){ActionListener listener = new TimePrinter();Timer t = new Timer(interval, listener);t.start();}/** * 内部类,这里用的是public修饰符 */public class TimePrinter implements ActionListener{@Overridepublic void actionPerformed(ActionEvent e) {Date now = new Date();System.out.println("At the tone, the time is " + now);if(beep){Toolkit.getDefaultToolkit().beep();}}}}
public void actonPerformed(ActionEvent event){ if(TalkingClock.this.beep) Toolkit.getDefaultToolkit().beep();}
ActionListener listener = this.new TimePrinter();
TalkingClock jabberer = new TalkingClock(1000, true);TalkingClock.TimePrinter listener = jabberer.new TimePrinter(); //注意这一行
import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;import java.util.Arrays;import java.util.Random;/** * 代理 */public class ProxyTest {public static void main(String[] args) {Object[] elements = new Object[1000];for(int i=0 ; i < elements.length; i++){Integer value = i+1;InvocationHandler handler = new TraceHandler(value);elements[i] = Proxy.newProxyInstance(null, new Class[]{Comparable.class}, handler);}//要查找的内容Integer key = new Random().nextInt(elements.length) + 1;//查找int result = Arrays.binarySearch(elements, key);//把查找到的对象打印出来if(result >= 0){System.out.println(elements[result]);}}}//调用处理器class TraceHandler implements InvocationHandler{private Object target;public TraceHandler(Object t){target = t;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.print(target);System.out.print("." + method.getName() + "(");if(args != null){for(int i=0; i<args.length; i++){System.out.print(args[i]);if(i < args.length -1) System.out.print(",");}}System.out.println(")");return method.invoke(proxy, args);}}