Voici comment je restructurerais votre code. Je vais vous expliquer les changements ci-dessous:
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";
}
- D'abord, nous avons tiré sur
statement
dans un constant, car il est pas changé.
- Ensuite, nous passons le
Scanner
en tant que paramètre, plutôt que d'en construire un nouveau. Il y a un certain nombre de raisons de préférer ceci, mais le principe est que vous devriez éviter de créer plusieurs instances Scanner
lisant de System.in
- généralement vous allez créer un tel Scanner
dans votre méthode main()
et le passer aux méthodes et classes qui ont besoin pour l'utiliser.
- Ensuite, plutôt que de lire directement à partir du scanner, nous utilisons les méthodes
has*()
pour inspecter l'état du scanner sans l'avancer. Cela change la sémantique de checkInput()
, car quand il retourne l'entrée en cours d'inspection est toujours dans l'analyseur, mais c'est plus cohérent avec une méthode nommée check...()
- il devrait inspecter, ne pas changer d'état. Parce que votre implémentation appelle .next()
vous perdez l'entrée fournie réelle, ce qui est probablement indésirable.
- Enfin, nous
return
de l'intérieur de chaque bloc, plutôt que de définir une variable temporaire inputType
et le renvoyer à la fin.
Votre méthode main()
peut maintenant ressembler à ceci:
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);
}
}
Prendre davantage, vous pouvez préférer avoir checkInput()
retourner un Class<?>
plutôt que d'un String
, puis construire votre déclaration séparément. Cela vous permettrait de gérer les entrées différemment. Par exemple:
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!");
}
}
}
Cela dit, nous sommes très bien réinventer la roue. La « bonne » façon d'utiliser Scanner
est d'utiliser les méthodes tapées directement - par exemple .:
if (scanner.hasNextInt()) {
int value = scanner.nextInt();
}
On évite ainsi besoin de faire une vérification de type manuel ou busywork similaire - il suffit de laisser faire Scanner
la validation pour vous.
Il serait probablement suffisant de simplement changer votre troisième ligne en 'String inputType =" UNKNOWN ";' - si les deux blocs 'try' échouent, vous retournerez' 'Cette entrée est de type UNKNOWN ''. – dimo414
@ dimo414 mais en considérant la cinquième ligne, si l'entrée ne serait pas float ou Integer, elle renverra toujours inputType sous forme de chaîne. –
@Vic pouvez-vous fournir une aide ou un lien, comment pourrais-je l'utiliser. –