Comment puis-je simplifier ce code?
Je vérifie chaque entrée pour une erreur, mais de la manière dont je le fais, le code est dupliqué.
long houseNumberOfFloors; while (true) { System.out.print("Enter valid house number of floors: "); try { houseNumberOfFloors = Long.parseLong(br.readLine()); } catch (NumberFormatException e) { continue; } if (FlatAttrValidator.checkHouseNumberOfFloors(houseNumberOfFloors)) { break; } } Integer houseNumberOfLifts; while (true) { System.out.print("Enter valid house number of lifts: "); try { houseNumberOfLifts = Integer.parseInt(br.readLine()); } catch (NumberFormatException e) { continue; } if (FlatAttrValidator.checkHouseNumberOfLifts(houseNumberOfLifts)) { break; } }
3 Réponses :
Vous pouvez passer la conversion et la validation en tant que fonction (s). ici réponse -> code> déclare un paramètre
réponse code> p> p>
J'écris juste la même chose, mais avec un Custom
converter == null code> cependant.
@Beundead merci très belle remarque, ajouté un requisenonnull code>. Dommage, j'aurais aimé voir une meilleure réponse avec la fonction à cérémonie.
Cela n'aurait pas été meilleur. Les exemples qu'ils utilisent jettent des erreurs de runtimédies, combinés à ne pouvoir captiver les types paramétrés en font une version Messier de cela.
J'ai créé la solution suivante pour vous, à l'aide d'interfaces fonctionnelles: Il fonctionne sur https://www.jdoodle.com/online-java-compiler/ . p> p>
Vous pouvez le faire comme suit:
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class Main { public static void main(String[] args) { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); long houseNumberOfFloors = input("Enter valid house number of floors: ", br, "checkHouseNumberOfFloors"); Integer houseNumberOfLifts = input("Enter valid house number of lifts: ", br, "checkHouseNumberOfLifts"); } static int input(String message, BufferedReader br, String methodName) { int value = 0; Method method; Boolean valid; System.out.print(message); try { value = Integer.parseInt(br.readLine()); method = FlatAttrValidator.class.getMethod(methodName, Integer.class); valid = (Boolean) method.invoke(null, value); if (!valid) { input(message, br, methodName); } } catch (IOException | NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { input(message, br, methodName); } return value; } }
Cela ne fonctionne pas car la valeur de retour de entrée code> ne va nulle part en l'appelant de manière récursive.
Cela fonctionnera @adder. Notez que code> appelle code> est appelé récursivement uniquement pour une valeur code> invalide code> ou en cas d'exception, le but de l'appel récursif est simplement de forcer l'utilisateur à re-entré. Pour une valeur code> valide >, il n'y aura pas d'appel récursif de entrée code> et la valeur
code> sera simplement renvoyé. Cependant, je viens de traverser votre réponse qui est vraiment plus élégante que la mienne.
Je maintiens mon commentaire. Vous devriez écrire une entrée de retour (message, BR, MethodName); Code>
Modulariser. Le code dupliqué va dans une méthode. La méthode accepte l'invite de l'utilisateur et renvoie l'entrée de l'utilisateur.
différents types
Peu importe.