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