这是在这里使用可选的不良做法吗?

Is this use of Optional bad practice here?

我想检查一下我在这里使用 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.isPresentOptional.get 是不好的做法。但是我找不到任何方法来使用 Optional.ifPresent 或 Optinal.map 等其他函数,因为如果结果还无效,我必须循环。

谢谢。

在您的 fromMnemonic 版本中,对于每次调用,您都遍历所有枚举值并检查匹配常量。相反,你可以在你的枚举类型中声明一个从助记符到枚举常量的静态Map<Character, Move>,并在class初始化时急切地初始化它。然后你可以像这样在 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 方法的 return 类型,那么方法的主体应该是这样的。

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

这会让您的客户完好无损。