Это использование Дополнительной плохой практики здесь? - PullRequest
0 голосов
/ 06 апреля 2020

Я хотел проверить, противоречит ли мое использование Optional здесь передовому опыту.

public Move getChoice() {

    Optional<Move> move = Optional.empty();
    while (!move.isPresent()) {
        System.out.println("Enter move code : R => Rock, P => Paper, S => Scissors");
        move = Move.fromMnemonic(consoleReader.readPlayerInput());
    }
    return move.get();
}




public enum Move 
{
    ROCK('R'), PAPER('P'), SCISSORS('S');

    private final char mnemonic;
    public static Move[] values = values();

    Move(char mnemonic) {
        this.mnemonic = mnemonic;
    }

    public static Optional<Move> fromMnemonic(char playerInput) {
      return Arrays.stream(values).filter(v -> v.mnemonic == playerInput).findFirst();
    }
}

Моя цель состояла в том, чтобы избежать создания другого экземпляра Enum 'UNKOWN'. Я прочитал, что использование Optional.isPresent и Optional.get является плохой практикой. Но я не могу обойтись без использования других функций, таких как Optional.ifPresent или Optinal.map, поскольку мне нужно l oop, пока результат еще не действителен.

Спасибо.

1 Ответ

2 голосов
/ 06 апреля 2020

В вашей версии fromMnemonic для каждого вызова вы перебираете все значения перечисления и проверяете на совпадение константы. И наоборот, вы можете объявить stati c Map<Character, Move> из mnemoni c в константу перечисления в вашем типе перечисления и инициализировать ее с нетерпением при инициализации класса. Затем вы можете использовать его внутри метода fromMnemonic следующим образом.

private static final Map<Character, Move> mnemonicToMoveMap = Arrays.stream(values)
    .collect(Collectors.toMap(m -> m.mnemonic, m -> m));

public static Move fromMnemonic(char playerInput) {
    return mnemonicToMoveMap.get(playerInput);
}

И вот как выглядит ваш клиент.

public Move getChoice() {
    Move move = null;
    while (move == null) {
        System.out.println("Enter move code : R => Rock, P => Paper, S => Scissors");
        move = Move.fromMnemonic(consoleReader.readPlayerInput());
    }
    return move;
}

Если вам действительно нужно использовать Optional<Move> в качестве верните тип вашего fromMnemonic метода, тогда тело метода должно быть таким:

public static Optional<Move> fromMnemonic(char playerInput) {
    return Optional.ofNullable(mnemonicToMoveMap.get(playerInput));
}

И это оставляет вашего клиента нетронутым.

...