成都网站建设设计

将想法与焦点和您一起共享

匿名内部类的理解(java+Android)-创新互联

是不是有同学跟我一样学了知识,不使用,一段时间就忘了? 今天说说java的匿名内部类这个东西,今天就因为这个东西被程序媛欺负了,我心里难受啊。
在这里插入图片描述

网站的建设成都创新互联公司专注网站定制,经验丰富,不做模板,主营网站定制开发.小程序定制开发,H5页面制作!给你焕然一新的设计体验!已为社区文化墙等企业提供专业服务。

匿名内部类的官方说法特别不容易理解,是从"有没有名字"给它命名,而不是功能命名,导致很多人学了都不知道怎么用,考试厉害实操菜,今天就说说匿名内部类的经典实操案例。废话到此结束!

一、简单案例(错误案例)

首先,先看一个简单的使用案例,假设:程序媛有一个写好的类叫做HerClass

//程序媛的类
public class HerClass {public void onChange(String content){//顺序: 3
    }

}

我的类要去实例化她的类,并且调用她的方法

//我的类
public class MyClass {public static void main(String args[]) {HerClass herClass=new HerClass(){@Override
            public void onChange(String content) {//顺序:2
                super.onChange(content);
            }
        };

        //顺序:1
        herClass.onChange("传输的数据");

    }

}

代码跑起来的顺序如代码中的注释,顺序1-2-3。 很多网上的写法都是这么干的,确实没啥毛病,但是这么写有什么意义呢? 不具备实际使用意义,不会有这种需求。

二、匿名内部类的正确使用方法(正解案例)

我以安卓中的Handle为例子,学习Android的同学一定知道Android切到UI线程的Handle.

public class Demo {public static void main(String args[]) {//顺序:1(子线程)
        Message message=new Message();
        message.what=999;
        handler.sendMessage(message);
    }

    android.os.Handler handler=new Handler(Looper.getMainLooper()){@Override
        public void handleMessage(@NonNull Message msg) {//顺序:2(主线程)
            int data=msg.what;//得到数据999
            super.handleMessage(msg);
        }
    };

}

main方法中通过handler.sendMessage()把消息发送到Handler类中,Handler类进行一系列的处理(也就是转到UI线程),之后调用handleMessage()方法,此时调到的方法就是我们匿名内部类里面的方法,而且是转了线程的。

三、回到我和程序媛的故事

看了Android的Handle案例,我们把之前的错误案例改一版,改成有意义的案例。
假如:我让程序媛帮我算一算这个星期我花了多少钱,她可能要算五分钟,或者十分钟,这个过程不需要我等待,算好后她主动告诉我。

我的类:
//我的类
public class MyClass {public static void main(String args[]) {HerClass herClass=new HerClass(){@Override
            public void onChange(String content) {Log.d("fxHou","顺序:3 我得到他计算的结果");
                //顺序:3
                super.onChange(content);
            }
        };

        Log.d("fxHou","顺序:1 我告诉程序媛,帮我算一算");
        //顺序:1 我告诉程序媛,帮我算一算
        herClass.option("我这个星期的花钱记录");

    }

}
她的类
//程序媛的类
public class HerClass {public void onChange(String content){Log.d("fxHou","顺序:4 她自己存档一份");
        //顺序:4
    }

    public void option(Object data){Log.d("fxHou","顺序:2 程序媛开始帮我计算");
        //顺序:2
        // TODO: 2023/1/11 程序媛开始帮我计算,计算可以使五分钟,十分钟,或者更久。

        //计算好之后把结果通知回去
        onChange("计算结果");
    }

}

数据打印结果

2023-01-11 19:19:56.370 11608-11608 fxHou                   com.example.cavasdemo                D  顺序:1 我告诉程序媛,帮我算一算
2023-01-11 19:19:56.370 11608-11608 fxHou                   com.example.cavasdemo                D  顺序:2 程序媛开始帮我计算
2023-01-11 19:19:56.370 11608-11608 fxHou                   com.example.cavasdemo                D  顺序:3 我得到他计算的结果
2023-01-11 19:19:56.370 11608-11608 fxHou                   com.example.cavasdemo                D  顺序:4 她自己存档一份

梳理一下这份代码,发现,它形成了一种观察者模式,好好整理完全可以封装出一套观察者工具(后期出)。

四、拓展(用匿名内部类观察底层API数据)

有时候我们需要拿底层API某个方法里面的数据,发现API没有提供获取的方法,而且我们只有只读权限,这时候匿名内部类就能派上用场,只要这个方法是public void就行。

//假设:这是某个我们只有只读权限的API
public class someoneApi {public void onChange(String canInfo){//假设:这里有一大堆逻辑,但是没有提供方法让我们获取canInfo
    }

}

观察数据的类

public class MyClass {public static void main(String args[]) {someoneApi herClass=new someoneApi(){@Override
            public void onChange(String canInfo) {//轻松得到canInfo
                super.onChange(canInfo);
            }
        };

    }

}

同理,这种办法也可以用在两个开发人员之间的代码通信,有时候我们想要获取祖传代码的参数数据,但是又不想动祖传代码,一样可以这么做。

完。。。。。。。蛋

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


文章名称:匿名内部类的理解(java+Android)-创新互联
链接分享:http://chengdu.cdxwcx.cn/article/dgjisd.html