以下是我将如何重构您的代码。我会在下面解释的变化:
private static final String STATEMENT = "This input is of type ";
public static String checkInput(Scanner scanner) {
if (scanner.hasNextFloat()) {
return STATEMENT + Float.class.getSimpleName();
else if (scanner.hasNextInt()) {
return STATEMENT + Integer.class.getSimpleName();
}
return STATEMENT + "UNKNOWN";
}
- 首先,我们拉出来
statement
成constant,因为它没有被改变。
- 其次,我们通过
Scanner
作为参数,而不是构建一个新的。有多种原因可以选择,但原则是您应避免在System.in
中创建多个Scanner
实例 - 通常您会在main()
方法中创建这样的Scanner
,并将其传递给需要的方法和类使用它。
- 接下来,我们使用
has*()
方法检查扫描仪的状态,而不是直接从扫描仪读取数据,而不是直接从扫描仪读取数据。这改变了checkInput()
的语义,因为当它返回被检查的输入时仍然在扫描器中,但这与名为check...()
的方法更为一致 - 应该检查,而不是更改状态。因为你的实现调用.next()
你失去了实际提供的输入,这可能是不可取的。
- 最后,我们
return
从每个块内,而不是设置一个临时inputType
变量,并在最后返回它。
你main()
方法现在看起来可能是这样:
public static void main(String[] args) {
// using try-with-resources so we don't have to call .close()
try (Scanner scanner = new Scanner(System.in)) {
System.out.println(checkInput(scanner));
String input = scanner.next(); // this actually advances the scanner
System.out.println("You input: " + input);
}
}
采取进一步行动,你可能更喜欢让checkInput()
返回Class<?>
而非String
,然后分别构建你的声明。这将允许您以不同方式处理输入。例如:
public static Class<?> inputType(Scanner scanner) {
if (scanner.hasNextFloat()) {
return Float.class;
else if (scanner.hasNextInt()) {
return Integer.class;
}
// add other types as needed
return String.class;
}
public static void main(String[] args) {
try (Scanner scanner = new Scanner(System.in)) {
Class<?> inputType = inputType(scanner);
String input = scanner.next();
System.out.println("You input: " + input);
if (inputType.equals(Integer.class)) {
System.out.prinln("That's a valid integer!");
}
}
}
所有这一切说,我们非常这里重新发明轮子。 “正确”的方式来使用Scanner
是直接使用的类型的方法 - 例如: -
if (scanner.hasNextInt()) {
int value = scanner.nextInt();
}
这避免了需要做任何手动型检查或类似的无用功 - 只是让Scanner
为你做验证。
将第三行改为'String inputType =“UNKNOWN”;' - 如果你的'try'块都失败了,你会返回''这个输入的类型是UNKNOWN'''。 – dimo414
@ dimo414但考虑到第五行,如果输入不是float或Integer,它总是会返回inputType作为字符串。 –
@Vic你能提供任何帮助或链接,我怎么能使用它。 –