在try-catch-finally
的情况下,当涉及到调用方法时,处理finally
的正确方法是什么?
我问的原因是一个服务实现类,使DB调用可能在每个方法中有一个finally
子句。
如果我要使用DRY方法,我不希望finally
子句重复相同的代码。
try {
// DB call
} catch (DAOException e) {
// Error messages etc
} finally {
// entityMangerProvider is a field
EntityManager entityManager = entityManagerProvider.get();
EntityTransaction transaction = entityManager.getTransaction();
if (entityManager.isOpen()) {
if (transaction.isActive()) {
transaction.rollback();
}
entityManager.close();
}
}
上面的finally
会一直重复。这样做合适吗?
private void closeEntityManager() {
EntityManager entityManager = entityManagerProvider.get();
EntityTransaction transaction = entityManager.getTransaction();
if (entityManager.isOpen()) {
if (transaction.isActive()) {
transaction.rollback();
}
entityManager.close();
}
}
然后执行
try {
// DB call
} catch (DAOException e) {
// Error messages etc
} finally {
closeEntityManager();
}
这种方法有什么缺点吗?有没有更好的方法来避免一遍又一遍地重复finally子句呢?
项目是在Java 7上,如果重要的话。
不,您的新方法方法似乎没有任何限制。可以创建方法以在代码中提供灵活性。
你只有一个entityManagerProvider
(如果从其他地方调用,你可以把它作为参数传递给这个新方法),然后你就可以处理所有新创建的对象和引用;因此,定义新方法并在使用finally{…}时调用它是完美的。