这是在这里使用可选的不良做法吗?
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.isPresent 和 Optional.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));
}
这会让您的客户完好无损。
我想检查一下我在这里使用 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 等其他函数,因为如果结果还无效,我必须循环。
谢谢。
在您的 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));
}
这会让您的客户完好无损。