В вашей версии 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));
}
И это оставляет вашего клиента нетронутым.