/** * La classe Conversion permet de convertir une somme en Euro. * * Version 3. */ public class Conversion { /* * Cette version utilise une nouvelle classe Devise, ce qui améliore la * modularité du programme et donc sa réutilisation et sa lisibilité. * * Certains problèmes de la deuxième version sont toujours présents : * * utilisation de Error() plutôt qu'une exception ; * * pas de possibilité de rajout d'une devise ; * * problème d'efficacité de la méthode rechercheDevise(String) ; * * Nouveau problème : il n'existe que des devises à taux variable. Il est * donc possible de modifier le taux de conversion, alors que ce devrait * être parfois interdit. */ private static final String[] NOMS_DEVISES = { "Franc", "Mark", "Dollard", "Euro" }; private static final double[] TAUX_CHANGE = { 6.55957, 1.95583, 1.2713, 1. }; private static final Devise[] DEVISES = new Devise[NOMS_DEVISES.length]; /* * Bloc statique, exécuté au chargement de la classe. */ static { for (int i = 0; i < DEVISES.length; ++i) { DEVISES[i] = new Devise(NOMS_DEVISES[i], TAUX_CHANGE[i]); } } private static Devise chercherDevise(String nom) { for (Devise d : DEVISES) { if (d.nom().equals(nom)) { return d; } } return null; } public static Devise devise(String nom) { Devise d = chercherDevise(nom); if (d == null) { throw new Error("Devise " + nom + " inconnue"); } return d; } public static boolean deviseTraitee(String nom) { return (chercherDevise(nom) != null); } /* * Le tableau DEVISES est recopié pour éviter que son contenu ne puisse être * modifié. */ public static Devise[] devisesTraitees() { Devise[] copieDevises = new Devise[DEVISES.length]; System.arraycopy(DEVISES, 0, copieDevises, 0, DEVISES.length); return copieDevises; } public static void main(String[] args) { double valeurAConvertir = Double.valueOf(args[0]).doubleValue(); String nomDevise = args[1]; if (deviseTraitee(nomDevise)) { System.out.println(devise(nomDevise).conversionEnEuro( valeurAConvertir) + " Euros"); } else { Devise[] devises = devisesTraitees(); System.out.print("Devise inconnue (devises traitées ="); for (int i = 0; i < devises.length; ++i) { System.out.print(" " + devises[i].nom()); } System.out.println(")"); } } }