“为所欲为”的匿名类:观察者篇

通晓编程语言的基本知道,按作用范围(或者说“域”),变量有局部或全局变量之分。域也可以说是“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界面在内的任何资源,可谓“为所欲为”。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值