3月30日 代码检视日志

if 异常判断尽量使用Assert 例如:

if(CollectionUtils.isEmpty(hotContents)) { log.error("社区主题获取7*24小时精选内容获取数据错误:{}",hotContents); throw new BusinessAPIException("社区主题获取7*24小时精选内容获取数据错误"); }

可以改为 Assert
Assert.notEmpty(hotContents, "社区主题获取7*24小时精选内容获取数据错误");

【3月30日 代码检视日志】再如:
if (CommunityConsts.TAB_NEWS_SUCCEED_STATUS.equals(tabNewResponse.getCode())) { // do somethings } else { throw new APICallException(tabNewResponse.getCode(), tabNewResponse.getMsg()); }

可以改为:
Assert.isTrue(TAB_NEWS_SUCCEED_STATUS.equals(tabNewResponse.getCode()), "7×24tab资讯推荐获取资讯接口 Fail! code: {} - msg: {}", tabNewResponse.getCode(), tabNewResponse.getMsg());

如果Assert抛出的异常不满足要求(例如要抛出个别的异常),那至少也包装一个静态方法,例如 BizAssert。这里主要的问题是出现了大量重复的判断语句,所以最好尽量消除这些重复代码。
异常处理不是常态 异常处理不是常态,尽量不要侵入正常业务逻辑。
例如,对返回值进行校验,之前很多代码会这样写:
if (validateUtil.checkInvalid(data)) { log.error("接口返回数据错误:{}",data.getRemList()); throw new BusinessAPIException("接口返回数据错误"); }

这里仅仅只是做了个异常转换,没啥营养,完全可以封装一个新的校验方法并在里面抛出异常。封装完后写成,
validateUtil.bizCheck(data, "xxx msg");

Domain Model 尽可能封装,不要过度暴露 来看个例子,
@Data @AllArgsConstructor public class ReviewWealthFocusInfo {List reviewWealthFocus; public List getReviewWealthFocus() { if (reviewWealthFocus.size() > CommunityListConsts.FIRST_COMMUNITY_LIST) { return reviewWealthFocus.stream() .limit(3) .collect(Collectors.toList()); } return reviewWealthFocus; } }

可以看到,这个类里面,只有一个成员,而且已经有了 getter 了,但有些同学还是习惯加上 lombok 的注解 @Data。lombok有时候只是图个方便,其实破坏了封装性。
可以改成这样,添加一个构造函数,里面还可以加些入参校验。并没有比lombok麻烦,IDEA有快捷键可以快速添加 constructor, getter, setter, override 等。
public class ReviewWealthFocusInfo {private List reviewWealthFocus; public ReviewWealthFocusInfo(List reviewWealthFocus) { Validate.notNull(reviewWealthFocus); this.reviewWealthFocus = reviewWealthFocus; }public List getReviewWealthFocus() { return reviewWealthFocus.subList(0, Math.min(FIRST_COMMUNITY_LIST, reviewWealthFocus.size())); } }

上述例子还有一个有毒的地方,就是 List 的截取,顺手改了,不细说。
需要重复调用的地方,请使用循环 检视过程中,我还发现有个地方,同一个方法重复调用了两次。getTabNewsIds() 这个方法居然重复了两次,令人十分费解。
List tabNewsIds = getTabNewsIds(); List otherTabNewsIds = getTabNewsIds(); ids = getTotalTabNewsId(tabNewsIds,otherTabNewsIds);

且不说这是出于何种原因要这么写,至少整个循环吧?一个简单的循环就包装起来了
private List getEnoughTabNewsIds() { List ids = Lists.newArrayList(); while (ids.size() <= NEWS_NUM_THRES) { ids.addAll(getTabNewsIds()); } return ids; }

    推荐阅读