使用 'finally' 调用设计方法
Using 'finally' to call a method by Design
在 try-catch-finally
情况下,调用方法时 finally
的正确处理方式是什么?
我问的原因是进行数据库调用的服务实现 class 可能在每个方法中都有一个 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{...} 的任何地方调用它是完美的。
在 try-catch-finally
情况下,调用方法时 finally
的正确处理方式是什么?
我问的原因是进行数据库调用的服务实现 class 可能在每个方法中都有一个 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{...} 的任何地方调用它是完美的。