return业务方法的类型和异常处理的最佳方式是什么?

What is the best way of return type and exception handling of business method?

在return类型和异常处理中,以下哪种业务方法最好?

/**
 * Finds an entity identified by given arguments.
 * @param ...
 * @returns found entity of {@code null} if not found.
 */
public MyEntity find1(...) {
    try {
        return query.getSingleResult();
    } catch (final NoResultException nre) {
        return null;
    }
}

/**
 * Finds an entity identified by given arguments. Note that this method
 * may raise {@code NoResultException}.
 * See {@link TypedQuery#getSingleResult()}.
 * @param ...
 * @returns found entity
 */
public MyEntity find2(...) {
    ...
    return query.getSingleResult(); // may throw NoResultException
}

/**
 * Finds an entity identified by given arguments.
 * @param ...
 * @returns an optional of found entity; never {@code null}
 */
public Optional<MyEntity> find3(...) {
    try {
        return Optional.of(query.getSingleResult());
    } catch (final NoResultException nre) {
        return Optional.empty();
    }
}

你所有的变体都是正确的。它们都是对异常做出反应的有效实现。

一组编码规则告诉您必须 return 可选值,始终在内部捕获异常或其他任何东西,这会使它们不合适。所以只要你没有这样的规矩,或者你坚持,就没事。

Which of following business methods are best, in return type and exception handling?

find1 绝对不好,因为它 returns null 并使用异常来控制流程。

find2 绝对适用于预期存在实体的情况。

如果find3重写时没有try-catch块,那么对于实体可能不存在的情况也有好处。