【发布时间】:2017-03-28 06:23:32
【问题描述】:
我的服务中有以下插入/更新方法:
@Override
public void insertEntity(Entity entity) {
try {
entityDao.insert(entityMapper.entityToEntityDO(entity));
} catch (DataIntegrityViolationException ex){
if(ex.getCause() instanceof SQLIntegrityConstraintViolationException) {
SQLIntegrityConstraintViolationException violationEx = (SQLIntegrityConstraintViolationException) ex.getCause();
if(violationEx.getErrorCode() == 1048 && "23000".equals(violationEx.getSQLState())) {
throw new FieldCannotBeNullException(violationEx.getMessage());
}
}
throw ex;
}
}
@Override
public void updateEntity(Entity entity) {
try {
entityDao.update(entityMapper.entityToEntityDO(entity));
} catch (DataIntegrityViolationException ex){
if(ex.getCause() instanceof SQLIntegrityConstraintViolationException) {
SQLIntegrityConstraintViolationException violationEx = (SQLIntegrityConstraintViolationException) ex.getCause();
if(violationEx.getErrorCode() == 1048 && "23000".equals(violationEx.getSQLState())) {
throw new FieldCannotBeNullException(violationEx.getMessage());
}
}
throw ex;
}
}
如您所见,insertEntity 和updateEntity 的实际逻辑非常简单。为了抛出一个自定义的Exception,我做了一些数据库错误代码检查。由于这两种方法都需要这种检查,所以两种方法中的代码都重复了,这显然是代码异味。
如何消除这种重复代码?
【问题讨论】:
-
看
@Override注解:是否使用Java 8,有updateEntity和insertEntity-方法的超类或实现接口是什么? -
我只是将 catch 块中的代码放到一个单独的方法中。
-
您可能会考虑摆脱异常作为控制流程的一种方式。我想象你所做的不仅仅是检查空列 - 所以调用这些方法的代码有很多异常处理要做。这在 Java 中是惯用的,但不是特别可读或高效......
标签: java refactoring code-duplication