最常见的是JavaScript的ajax的回调,经常会把人整蒙,其实java中的回调如果应用的好,其实感觉也会有一种精妙 的使用感觉,回味无穷,比如像我们国美的Redis 调用封装,有一个redis template,
在一个类有一个 执行方法A,方法的参数就是一个 接口b,那他在调用这个接口b的时候其实就是在使用接口 方法C,重写 接口的方法C,这个方法C的返回值就是回调值,C的返回值 又被A使用,A调用结束后返回 A的返回值。
下面代码演示
A 对应 SimpleJedisTemplate中的 execute()()
b 对应 接口RedisCallback <T>
C 对应 接口RedisCallback<T> 中 doInRedis(方法)
调用过程 对应 getRecommendDto()
样例
public class SimpleJedisTemplate {
public <T> T execute (RedisCallback<T> action) {
boolean broken = false;
JedisCommands jedisCommands = null;
try {
jedisCommands = getJedisCommands();
return action.doInRedis(jedisCommands);
} catch (Exception e) {
broken = true;
throw e;
} finally {
if (!isCluster) {
closeResource((Jedis) jedisCommands, broken);
}
}
}
public static abstract interface RedisCallback<T>{
T doInRedis ( JedisCommands c ommands);
}
调用方法
public List<RecommendDto> getRecommendDto(final String recommendType) {
try {
return simpleJedisTemplate.execute(
new RedisCallback <List<RecommendDto>>() {
public List<RecommendDto> doInRedis(
JedisCommands commands) {
String allRec = commands.hget(KeyUtil.RECOMMEND_KEY, recommendType);
return JsonUtil.toObjArray(allRec, RecommendDto.class);
}
});
} catch (Exception e) {
log.error("获取推荐位缓存异常!", e);}return null;
}