暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Java实战-回调之内部类与Lamda

程序员的日记本 2020-08-20
791


为避免浪费你的宝贵时间,请先浏览本文章目录:


1、内部类

2、实战-利用匿名内部类实现回调

3、Lamda



01

内部类


内部类顾名思义,在一个已有类的内部的一个类,一般在实际项目中常用三种方式。


表现形式一:


非static,依赖于外部类,只能访问外部类中的非静态变量,且在内部类中不能出现static的声明。

Integer id;
public InnerClass(Integer id){
this.id = id;
}
public void getUserName(String name){
System.out.println(id + " : " + name);
}
public static void main(String[] args) {
InnerClass ic = new InnerClass(1);
User u = ic.new User(); //注意这里
u.selectById();
}
class User{
public void selectById(){
if(id == 1){
getUserName("zs");
}else{
getUserName("none");
}
}
}



表现形式二:

static模式,又称为嵌入式类,由于是static ,因此不依赖于外部类,但是又是隐藏在外部类中,又可以使用外部类的静态成员变量。

public static String PID = "123";
public static void main(String[] args) {
User user = new InnerClass.User(); //注意这里
}
static class User{
// 静态内部类不能访问外部类的非静态成员(包括非静态变量和非静态方法)
public void selectById(){
if(PID.equals("123")){
System.out.println("我只能访问外部类的静态成员");
}
}
}


表现形式三:

匿名内部类,顾名思义是一种没有名字的类。不明白,还记得下面的代码吗?

new Thread(new Runnable() {
public void run() {
//此处省略一万字
}
}).start();


new Thread 接受的就是一个匿名内部类,因为Runnable是一个接口,而不是一个类。所以匿名内部类就是一个父类的继承类或者是一个接口的实现类,他没有自己的类名。


02

实战-利用匿名内部类实现回调


public class InnerClassCallback {
private Integer userId;
private String uName;
public static void main(String[] args) {
new InnerClassCallback(1).clientEvent();
}
public InnerClassCallback(Integer userId){
this.userId = userId;
}
//触发事件,并将返回的结果更新到外部类
public void clientEvent(){
Worker wk = new Worker();
//将实现Event接口的匿名内部类传递给Worker
wk.worker(userId , new Event() {
public void clickEvent(String userName) {
uName = userName;
System.out.println("查询结果:" + uName);
};
});
}
}
//在workder执行实际的操作
class Worker{
public void worker(Integer userId , Event event){
if(userId == 1){
event.clickEvent("zs");
}
}
}
//匿名内部类需要实现的接口
interface Event{
void clickEvent(String name);
}

当然实现回调的方法有多种,例如将InnerClassCallback这个类传递给worker,直接利用woker来更新成员变量,调用成员方法;但是无疑使用内部类的方式不管是从逻辑上,还是代码可读性上都更胜一筹。在Android中,Java GUI中都大量运用了匿名内部类完成回调的工作。



02

Lamda


同样代码,在JDK1.8中,我们可以使用Lamda的方式来进行替换。将InnerClassCallback中的clientEvent方法替换为下面的方法,将会使代码更加简洁。

//使用lamda表达式
public void clientEvent(){
Worker wk = new Worker();
wk.worker(userId , (c)-> {this.uName=c ; System.out.println("lamda: "+c);});
}



文中所有代码均可以在线下载

https://gitee.com/wsyjiamian/JavaDiary.git


文章转载自程序员的日记本,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论