一不小心掉入了 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();}}
}
执行结果如下