JAVA编程技巧(五)

五、利用工具方法

5.1. 避免空值判断

普通:

if (userList != null && !userList.isEmpty()) {
    // TODO:  处理代码 
}

精简:

if (CollectionUtils.isNotEmpty(userList)) {
    // TODO: 处理代码 
}

5.2. 避免条件判断

普通:

double result;
if (value <= MIN_LIMIT) {
    result = MIN_LIMIT;}
else {
    result = value;
}

精简:

double result = Math.max(MIN_LIMIT, value);

5.3. 简化赋值语句

普通:

public static final List<String> ANIMAL_LIST;
static {
    List<String> animalList = new ArrayList<>();
    animalList.add("dog");
    animalList.add("cat");
    animalList.add("tiger");
    ANIMAL_LIST = Collections.unmodifiableList(animalList);
}

精简:

// JDK 流派 
 
public static final List<String> ANIMAL_LIST = Arrays.asList("dog", "cat", "tiger");
 
// Guava 流派 
 
public static final List<String> ANIMAL_LIST = ImmutableList.of("dog", "cat", "tiger");

注意:Arrays.asList 返回的 List 并不是 ArrayList,不支持 add 等变更操作。

5.4. 简化数据拷贝

普通:

UserVO userVO = new UserVO();
userVO.setId(userDO.getId());
userVO.setName(userDO.getName());
...
userVO.setDescription(userDO.getDescription());
userVOList.add(userVO);

精简:

UserVO userVO = new UserVO();
BeanUtils.copyProperties(userDO, userVO);
userVOList.add(userVO);

反例:

List<UserVO> userVOList = JSON.parseArray(JSON.toJSONString(userDOList), UserVO.class);

精简代码,但不能以过大的性能损失为代价。例子是浅层拷贝,用不着 JSON 这样重量级的武器。

5.5. 简化异常断言

普通:

if (Objects.isNull(userId)) {
    throw new IllegalArgumentException("用户标识不能为空");
}

精简:

Assert.notNull(userId, "用户标识不能为空");

注意:可能有些插件不认同这种判断,导致使用该对象时会有空指针警告。

5.6. 简化测试用例

把测试用例数据以 JSON 格式存入文件中,通过 JSON 的 parseObject 和 parseArray 方法解析成对象。虽然执行效率上有所下降,但可以减少大量的赋值语句,从而精简了测试代码。

普通:

@Test
public void testCreateUser() {
    UserCreateVO userCreate = new UserCreateVO();
    userCreate.setName("Changyi");
    userCreate.setTitle("Developer");
    userCreate.setCompany("AMAP");
    ...
    Long userId  = userService.createUser(OPERATOR, userCreate);
    Assert.assertNotNull(userId, "创建用户失败");
}

精简:

@Test
public void testCreateUser() {
    String jsonText = ResourceHelper.getResourceAsString(getClass(), "createUser.json");
    UserCreateVO userCreate = JSON.parseObject(jsonText, UserCreateVO.class);
    Long userId  = userService.createUser(OPERATOR, userCreate);
    Assert.assertNotNull(userId, "创建用户失败");
}

建议:JSON 文件名最好以被测试的方法命名,如果有多个版本可以用数字后缀表示。

5.7. 简化算法实现

一些常规算法,已有现成的工具方法,我们就没有必要自己实现了。

普通:

int totalSize = valueList.size();
List<List<Integer>> partitionList = new ArrayList<>();
for (int i = 0; i < totalSize; i += PARTITION_SIZE) {
    partitionList.add(valueList.subList(i, Math.min(i + PARTITION_SIZE, totalSize)));
}

精简:

List<List<Integer>> partitionList = ListUtils.partition(valueList, PARTITION_SIZE);

5.8. 封装工具方法

一些特殊算法,没有现成的工具方法,我们就只好自己亲自实现了。

普通:

比如,SQL 设置参数值的方法就比较难用,setLong 方法不能设置参数值为 null。

// 设置参数值 
if (Objects.nonNull(user.getId())) {
 
    statement.setLong(1, user.getId());
 
} else {
 
    statement.setNull(1, Types.BIGINT);
 
}

精简:

我们可以封装为一个工具类 SqlHelper,简化设置参数值的代码。

/** SQL 辅助类 */
public final class SqlHelper {
    /** 设置长整数值 */
    public static void setLong(PreparedStatement statement, int index, Long value) throws SQLException {
        if (Objects.nonNull(value)) {
            statement.setLong(index, value.longValue());
        } else {
            statement.setNull(index, Types.BIGINT);
        }
    }
    ...
}
 
 // 设置参数值 SqlHelper.setLong(statement, 1, user.getId());
正文完
 0
admin
版权声明:本站原创文章,由 admin 2016-01-03发表,共计2881字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处:https://www.mlzj.net。