文章解析: 一不小心掉入了 Java Interface 的陷阱

一不小心掉入了 Java Interface 的陷阱_腾讯新闻



import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

// 方便起见就都放在一个文件中了
public class TestSimpleResult {
    public static void main(String[] args) throws InterruptedException {
        // 这里new一个对象,默认就是属于方法私有的,但是因为implements BaseResult 为接口
        // 接口中字段的修饰符:public static final(默认不写)
        // 因此失去了方法中new对象隔离线程安全的意义
        SimpleResult result1 = new SimpleResult();
        result1.addPostTask(() -> {
            System.out.println("...发消息...");
        });
        result1.addPostTask(() -> {
            System.out.println("...发消息2...");
        });
        new Thread(() -> {
            SimpleResult result2 = new SimpleResult();  // 这里result2添加的消息窜西到result1中了
            result2.addPostTask(() -> {
                System.out.println("...发消息3...");
            });
            result2.addPostTask(() -> {
                System.out.println("...发消息4...");
            });
        }).start();
        Thread.sleep(1000);
        // 在返回结果之前,会对所有的后置任务进行遍历执行后置任务
        PostTaskUtil.process(result1.getPostTaskList());
    }
}
// 问题就在interface这里
interface BaseResult {
    List<PostTask> postTaskList = new ArrayList<>();

    default void addPostTask(PostTask postTask) {
        postTaskList.add(postTask);
    }

    default List<PostTask> getPostTaskList() {
        return postTaskList;
    }
}

interface PostTask {
    void process();
}

class SimpleResult implements BaseResult {
}

class PostTaskUtil {
    public static void process(List<PostTask> postTasks) {
        if (CollectionUtils.isEmpty(postTasks)) {
            return;
        }
        Iterator<PostTask> iterator = postTasks.iterator();
        while (iterator.hasNext()) {
            PostTask postTask = iterator.next();
            if (postTask == null) {
                return;
            }
            postTask.process();
            iterator.remove();
        }
    }
}


执行结果如下
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值