JAVA EFFICACE GUIDE DE PROGRAMMATION JOSBUA BLOCH RESUME Ce guide, écrit par un expert de Sun Microsystems, présente cinquante-sept règles de programmation concourant à l'écriture de programmes efficaces pour la plateforme java. Fruit de l'expérience des créateurs de java et des défis de programmation relevés au quotidien, chaque règle illustre divers aspects du langage et de ses difficultés au moyen de conseils, recommandations - ce qu'il faut faire; ce qu'il ne faut pas faire - et d'exemples détaillés: son bon usage idiomatique, ses subtilités et ses pièges,ses patterns et antipatterns. exception. » Excédant la seule programmation java, ces règles serviront de viatique pour la Programmation objet en général et la production de code clair, correct, efficace, robuste et réutilisable. Les bibliothèques java (java. lang, java. Util et dans une moindre mesure java. io) sont également abordées, ainsi que la sérialisation. «J'aurais voulu avoir ce livre il y a dix ans. Certains peuvent penser que je n'ai besoin d'aucun livre sur Java, mais celui-ci fait. » TABLE DES MATIERES Remerciements XI Avant-propos XIII Préface XV Chapitre 1 Présentation 1 Chapitre 2 Création et destruction d'objets 5 1. 2. 3. 4. 5. 6. Privilégier des méthodes de fabrique statiques aux constructeurs Appliquer la propriété du singleton avec un constructeur privé Empêcher l'instanciation avec un constructeur privé Empêcher la duplication d'objets Eliminer les références d'objets obsolètes Eviter les finaliseurs Chapitre 3 Méthodes communes à tous les objets 7. 8. 9. 10. 11. Obéir au contrat général lors d'une redéfinition de la méthode equals Toujours redéfinir hashCode lorsque equals est redéfini Toujours redéfinir toString Redéfinir judicieusement clone Envisager l'implémentation de Comparable Chapitre 4 Classes et Interfaces 5 10 12 14 18 21 25 25 36 42 45 54 59 12. Restreindre l'accès des classes et de leurs membres 59 13. 14. 15. 16. 17. Favoriser l'immuabilité Préférer la composition à l'héritage Prévoir et documenter l'héritage ou bien l'interdire Préférer les interfaces aux classes abstraites N'utiliser les interfaces que pour définir les types 63 71 78 83 88 17. 18. N'utiliser les interfaces que pour définir les types Favoriser les classes imbriquées statiques Chapitre 5 Equivalents pour constructions du langage C 19. 20. 21. 22. Remplacer les structures par des classes Remplacer une union par une hiérarchie de classes Remplacer les constructions enum par des classes Remplacer les pointeurs de fonctions par des classes et des interfaces Chapitre 6 Méthodes 23. 24. 25. 26. 27. 28. Vérifier la validité d'un paramètre Procéder à des recopies défensives en cas de besoin Concevoir avec attention la signature d'une méthode Utiliser la surcharge avec discernement Renvoyer des tableaux vides plutôt que pull Ecrire des commentaires de documentation pour tous les éléments exposés d'une API Chapitre 7 Programmation générale 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. Minimiser la portée des variables locales Connaître et utiliser les bibliothèques Eviter float et double si un résultat exact est requis Eviter les chaînes de caractères là où d'autres types sont plus appropriés Attention à la performance dans la concaténation de chaînes de caractères Faire référence à un objet via son interface Préférer les interfaces à la réflexion Utiliser judicieusement les méthodes natives Optimiser judicieusement Suivre les conventions de nommage généralement acceptées Chapitre 8 Exceptions 39. 40. 41. 42. 43. 44. 45. 46. 47. N'utiliser une exception que dans des situations exceptionnelles Utiliser une exception vérifiée pour une situation récupérable et une exception non vérifiée pour une erreur de programmation Ne pas abuser des exceptions vérifiées Préférer l'utilisation d'une exception standard Lever des exceptions en rapport avec l'abstraction Documenter toutes les exceptions levées par une méthode Inclure l'information de contexte dans les messages détaillés Garantir l'atomicité d'une erreur Ne pas ignorer une exception 88 96 95 95 98 102 113 117 117 120 124 126 131 133 137 137 141 145 148 151 153 155 158 160 164 169 169 173 175 177 179 182 184 186 188 Chapitre 9 Threads 189 48. 49. 50. 51. 52. 53. 189 196 202 205 209 213 Chapitre 10 54. 55. 56. 57. Synchroniser l'accès à toute donnée partagée et muable Eviter toute synchronisation excessive Ne jamais invoquer wait en dehors d'une boucle Ne pas s'appuyer sur l'ordonnanceur de threads Documenter la sûreté des threads Eviter les groupes de threads Sérialisation Implémenter judicieusement Serializable Envisager l'utilisation d'une sérialisation sur mesure Rédiger la méthode readObject de manière défensive Fournir une méthode readResolve lorsque cela est nécessaire 215 215 221 228 235 Bibliographie 239 Index des idiomes et patterns 243 Index TOP 245