在项目中,看别人代码,发现一种写法,如下:
@Override
public void execute(TaskContext ctx) {
logger.info("开始历史消息归档任务");
Date minTime = TimeUtil.minusDay(new Date(), keepMaxDay);
LoopPageExecutor.execute(new LoopCall<UserMsgHistory>() {
@Override
public List<UserMsgHistory> getBatch(int batchSize) {
List<UserMsgHistory> batchList = historyDao.queryExistSendTimeEalier(minTime, batchSize);
logger.info("待归档批次数:" + batchList.size());
return batchList;
}
@Override
public void processPageData(List<UserMsgHistory> data) {
List<ConcurrentCall<Boolean>> calls = new LinkedList<>();
for (UserMsgHistory his : data) {
calls.add(new MsgArchiveCall(his, minTime));
}
ConcurrentExecutor.execute(calls, 30);
}
}, 3000);
}
其中的excute方法中,定义并new了一个接口LoopCall<UserEntity>,其中实现了两个方法getBatch()和processprocessPageSize()。
那么接口能够直接通过new来实例化吗?答案是不能,且抽象类也同此。接口、抽象类可以理解成是模糊不定的东西,要使用它的特质必须要实例化,实例化不能直接通过new,而是通过实现接口方法、继承抽象类等。如上述代码方式,不同于普通的实例化对象,Object o = new Object(),而是通过new一个实现接口的匿名内部类LoopCall的方式,使用{}具体实现接口。
LoopCall接口定义如下:
public interface LoopCall<T> {
public List<T> getBatch(int batchSize);
public void processPageData(List<T> data);
}