【项目实战】 -- interface接口什么情况下可以被new?

在项目中,看别人代码,发现一种写法,如下:

	@Override
	public void execute(TaskContext ctx) {
		logger.info("开始历史消息归档任务");
		Date minTime = TimeUtil.minusDay(new Date(), keepMaxDay);

		LoopPageExecutor.execute(new LoopCall() {

			@Override
			public List getBatch(int batchSize) {
				List batchList = historyDao.queryExistSendTimeEalier(minTime, batchSize);
				logger.info("待归档批次数:" + batchList.size());
				return batchList;
			}

			@Override
			public void processPageData(List data) {
				List> calls = new LinkedList<>();
				for (UserMsgHistory his : data) {
					calls.add(new MsgArchiveCall(his, minTime));

				}
				ConcurrentExecutor.execute(calls, 30);
			}

		}, 3000);

	}

其中的excute方法中,定义并new了一个接口LoopCall,其中实现了两个方法getBatch()和processprocessPageSize()。

那么接口能够直接通过new来实例化吗?答案是不能,且抽象类也同此。接口、抽象类可以理解成是模糊不定的东西,要使用它的特质必须要实例化,实例化不能直接通过new,而是通过实现接口方法、继承抽象类等。如上述代码方式,不同于普通的实例化对象,Object o  = new Object(),而是通过new一个实现接口的匿名内部类LoopCall的方式,使用{}具体实现接口。

LoopCall接口定义如下:

	public interface LoopCall {

		public List getBatch(int batchSize);

		public void processPageData(List data);
	}

 

 

你可能感兴趣的:(【项目实战】 -- interface接口什么情况下可以被new?)