Nemek,
Merci pour tes remarques sur les flux et sur l'encodage. Je n'en étais pas encore à me poser la question, mais je pense que ça me servira. Côté String et StringBuffer, je suis familier du sujet mais pas encore expérimenté. J'y reviendrai probablement.
Par rapport à mes bouts de code, je suis conscient qu'ils soulèvent de nombreuses questions.
Discussion hors-sujet initial
Concernant l'algorithme même [ça sort du sujet initial], je veux bien discuter les éléments sur la récursivité. Je parlais de validation côté serveur, mais dans sa forme de base, la méthode est plus adaptée à une validation côté client (même si elle ne sera probablement pas en Java, mais plutôt en javascript). En effet, l'idée initiale, c'est de demander à l'utilisateur d'entrer un type spécifique au clavier et de le lui demander tant qu'il ne le fait pas. Pour ça, on essaie d'identifier le type en question dans le String qu'il saisit. Si l'identification de ce type est impossible (ie. ), on gère l'exception en lui redemandant la saisie. Ma question : pourquoi est-ce une mauvaise pratique de passer par les exceptions et par une récursivité ? je conçois bien le côté coûteux de la chose (c'est largement optimisable). On m'a conseillé d'éviter justement les boucles (notamment le do while, avec un booléen dans le while - ce que j'avais fait avant le try catch) sur ce genre de choses, car on se rapproche alors un peu trop du procédural. Et d'une certaine façon, on perd en lisibilité au sens "Java" du terme. N'y a-t-il pas un certain "juste" milieu entre ce qu'on ferait en C et la levée d'exceptions en Java ?
Position du problème.
Je cherche à écrire une classe de validation côté serveur. Elle contient des méthodes qui permettent de s'assurer que les objets que le serveur reçoit du client par la Socket sur l'ObjectInputStream (ou sur un autre flux entrant que j'utiliserai) sont des instances des classes attendues.
Comment j'ai commencé à le traiter.
J'ai écrit une classe de validation des entrées au clavier en ligne de commande pour quelques types presque primitifs. C'est pour ça que c'est un peu moche, notamment avec le BufferedReader instancié à chaque validation.(C'est aussi la raison d'être du System.in). Tel quel, ça fonctionne, dans le main de la classe de validation.
Ensuite (et c'est là que ça ne fonctionne plus), j'ai cherché à le faire en imaginant la problématique côté serveur : je ne recevrai plus d'infos par l'entrée standard, mais je veux être capable de valider un type sur n'importe quel type de flux entrant. Donc autant écrire la forme la plus générale possible, et prendre en paramètre de la méthode de validation un flux. Ni une, ni deux, je change en InputStream, et par la même occasion, quand j'instancie ce dernier dans le main, l'IDE me fait automatiquement réécrire la méthode read()(cf. @override). Pour tester, je dis alors que read() se comporte tout comme . Et c'est là que je vois que je ne suis pas parvenu à écrire une forme générale qui permette notamment de faire de la validation au clavier (d'où finalement les quelques println placés çà et là pour voir où ça bloque).
Au niveau de la console, voici ce qui se passe [EDIT : je précise : le processus ne termine pas].
1 2 3 4 5 6 7 8 9 10 11 12 13
| Secure Input Testing Unit
===================================
Please enter an integer here : trying to read a String
about to read
12
has read
about to read
has read
about to read
has read
about to read
has read
about to read |
Cela paraît-il plus clair ?
Merci
Partager