Использование Java 8 Необязательно - Преобразование логики - PullRequest
0 голосов
/ 28 апреля 2018

Я пытаюсь научиться использовать 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;
}

Вот как я пытался конвертировать его, используя 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;
}

Я бы подумал, что мне не понадобятся две отдельные проверки. Также я считаю, что изменил логику здесь, поскольку IsEmpty() не происходит.

Ответы [ 3 ]

0 голосов
/ 28 апреля 2018

Вы неправильно используете тип Optional<T> и, следовательно, не получите никакой выгоды, скорее, это усложнит понимание и поддержку вашего кода.

Вам также следует избегать передачи Optional<T> в качестве параметра метода, см. здесь .

Необязательный подход лучше подходит для логики этого типа, и поэтому я бы подчеркнул, что вы продолжаете этот подход.

Как @Cay S. Horstmann однажды упомянул в своей книге:

Ключом к эффективному использованию Optional является использование метода, который либо потребляет правильное значение или производит альтернативу.

0 голосов
/ 28 апреля 2018

Вы не хотите использовать 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;
}

(имена методов должны начинаться со строчной буквы в Java.)

Вы могли бы еще сжать это, но вопрос в том, будет ли код более понятным.

Нет ничего плохого в null, если используется правильно. Это означает «неопределенный», и у нас нет ненулевых ссылок на объекты в Java, как в Kotlin или Scala.

Но, возможно, вы могли бы немного подумать о том, как создаются User объекты, чтобы вообще избежать этой проблемы. Возможно, вы могли бы использовать шаблон проектирования Builder. Чаще всего переосмысление вашего кода может избежать подобных ситуаций.

0 голосов
/ 28 апреля 2018

Я хотел бы предупредить вас, что это безумие и так запутанно. И я не вижу смысла переписывать первый красивый подход *.

Но если вы действительно хотите играть с Optional, вот цепочка методов **:

Optional.of(
        Optional.ofNullable(user)
                .orElseThrow(() -> new Exception("No user!"))
)
        .map(User::getStuff)
        .filter(s -> !s.isEmpty())
        .orElseThrow(() -> new Exception("User has no stuff"));

* Также есть возможности для улучшения. !(!a && !b) просто означает a || b.

final String stuff = user.getStuff();
if (stuff == null || stuff.isEmpty()) {
    throw new Exception("User has no stuff");
}

** Я предположил, что getStuff возвращает String.

...