通晓编程语言的基本知道,按作用范围(或者说“域”),变量有局部或全局变量之分。域也可以说是“context”。如果按源代码文件来分,则有内部和外部的context域之分。弄清楚context域的意义,才有助于理解编程语言的设计作者的思想,提高自我的编程质素。这些跟题目的匿名类有什么关系?
我们知道,匿名类是“随手”起的。它重复率不高,但是又具有“相似”动作。所以每次使用的时候,需要重新定义动作内容。这除了少量的定义可以重复外,它怎么就能“为所欲为”了呢?
先来看看下面的代码:
package com.mrn6.annonymous_class_example;
public class Listener{
public void dosomething(AnySelfDefinedType args){
}
}
package com.mrn6.annonymous_class_example;
public class MainActivity extends Actiivty{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
// The following is Listener's definition.
}
这上面的Listener和MainActivity定义在同一源代码文件中,所以按文件分context域,它们是在同一context域内部。因此,当Listener匿名类在实例化后,可以调用MainActivity的任何全局变量。这正是匿名类的魅力所在。再看下面的代码:
package com.mrn6.annonymous_class_example;
public class MainActivity extends Actiivty{
private Handler handler;
private Listener listener;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
handler = new Handler();
setListener(new Listener(){
public void dosomething(AnySelfDefinedType args){
// global handler is accessible here.
handler.sendMessage(args);
}
});
}
private void setListener(Listener listener){
// Do anything you want to here.
this.listener = listener;
this.listener.dosomething(self_inited_args);
}
// The following is Listener's definition.
}
可以看到handler是MainActivity的变量,但是匿名类Listener的实例可以访问。Handler在Android中可以访问UI资源。这样即使将Listener类的定义放置任何地方,依然可以修改当前main context域的包括UI界面在内的任何资源,可谓“为所欲为”。