使用Java 8可选 - 转换逻辑

Tao*_*itz 1 java exception-handling optional java-8

我正在尝试学习如何Optional在Java中使用- 但这似乎不正确我在做什么.

User user = null;

public AuthCheck(User user) throws Exception {
    if (user == null) {
        throw new Exception("No user!");
    }
    if (!(user.getStuff() != null && !user.getStuff().isEmpty())) {
        throw new Exception("User has no stuff");
    }
    this.user = user;
}
Run Code Online (Sandbox Code Playgroud)

这是我尝试使用Optional以下方法转换它:

Optional<UserOptional> user;

public AuthCheckOptional(Optional<UserOptional> user) throws Exception {
    user.orElseThrow(() -> new Exception("No User!"));

    user.map(UserOptional::getStuff)
        .orElseThrow(() -> new Exception("User has no stuff"));

    this.user = user;
}
Run Code Online (Sandbox Code Playgroud)

我想我不需要两次单独检查.另外我相信我已经改变了逻辑,因为IsEmpty()没有发生.

Sev*_*One 5

您不想Optional用作输入参数; 这是一种反模式.查看有关DZone的这篇文章.

您可以采取以下措施来改进代码:

User user = null;

public authCheck(User user) {
    Objects.requireNonNull(user, "No user!");

    if (Objects.requireNonNull(user.getStuff(), "User has no stuff").isEmpty()) {
        throw new RuntimeException("User has no stuff");
    }

    this.user = user;
}
Run Code Online (Sandbox Code Playgroud)

(方法名称应以Java中的小写字母开头.)

你可以进一步压缩它,但问题是代码是否更清晰.

null如果使用得当,没有任何问题.它意味着"未定义",我们在Java中没有非空对象引用,就像在Kotlin或Scala中一样.

但也许您可以想一下如何User创建对象,以便完全避免这个问题.您也许可以使用Builder设计模式.通常,重新考虑代码可以避免这样的情况.

  • 感谢DZone,我肯定会打破一些反模式!我甚至都不知道Objects.requireNonNull存在. (2认同)