Chapitre 21
21 - Livres
> Résumés et analyses des livres fondamentaux pour l'ingénieur Java moderne
Chapitre 21 — Livres
Resumes et analyses des livres fondamentaux pour l'ingenieur Java moderne
1. Effective Java (3rd Edition) — Joshua Bloch
Presentation
- Auteur : Joshua Bloch (ancien architecte Sun/Oracle, Google)
- Edition : 3e edition (2018), couvre Java 7-9
- Pages : 368
- Note : 4.9/5 — Reference absolue
Structure (90 items)
Le livre est organise en 12 chapitres, chacun contenant des "items" (conseils) :
Chapitre 2 : Creation et destruction d'objets
- Item 1 : Fabriques statiques vs constructeurs
- Item 2 : Builder pattern (quand de nombreux parametres)
- Item 3 : Enums pour les singletons
- Item 4 : Classes utilitaires avec constructeur prive
- Item 5 : Injection de dependances plutot que hard-coding
- Item 6 : Eviter la creation d'objets inutiles
- Item 7 : Eliminer les references obsoletes
- Item 8 : Eviter les finalizers et cleaners
- Item 9 : try-with-resources pour les ressources
Application Java 21 : Les records remplacent avantageusement les classes de donnees (Item 1, 2). Les fabriques statiques restent pertinentes.
Chapitre 3 : Methodes communes a tous les objets
- Item 10 : Respecter le contrat de equals()
- Item 11 : Toujours surcharger hashCode() avec equals()
- Item 12 : Toujours surcharger toString()
- Item 13 : Surcharger clone() avec prudence (ou ne pas surcharger)
- Item 14 : Implementer Comparable
Application Java 21 : Les records fournissent equals/hashCode/toString automatiquement (Item 10-12).
Chapitre 4 : Classes et interfaces
- Item 15 : Minimiser l'accessibilite
- Item 16 : Champs d'instance publics → getters
- Item 17 : Immutabilite minimale
- Item 18 : Favoriser la composition sur l'heritage
- Item 19 : Design pour l'heritage ou interdire
- Item 20 : Interfaces plutot que classes abstraites
- Item 21 : Interfaces fonctionnelles marquees avec @FunctionalInterface
- Item 22 : Interfaces seulement pour les types
- Item 23 : Hierarchies de types taggees → sealed classes
- Item 24 : Classes membres statiques plutot que non-statiques
- Item 25 : Un fichier source = une classe de haut niveau
Application Java 21 : Les sealed classes (Item 23) permettent des hierarchies controlees. Les records sont immutables (Item 17).
Chapitre 5 : Generiques
- Item 26 : Ne pas utiliser les raw types
- Item 27 : Supprimer les avertissements unchecked
- Item 28 : List plutot que Array
- Item 29 : Favoriser les types generiques
- Item 30 : Favoriser les methodes generiques
- Item 31 : Bornes bornees pour la flexibilite
- Item 32 : Utiliser varargs generiques avec prudence
- Item 33 : Conteneurs de types avec TypeToken
Chapitre 6 : Enums et annotations
- Item 34 : Enums au lieu de constantes int
- Item 35 : Champs d'instance au lieu d'ordinals
- Item 36 : EnumSet au lieu de bit fields
- Item 37 : EnumMap au lieu de tableaux indexes
- Item 38 : Enums extensibles avec interfaces
- Item 39 : Annotations > conventions de nommage
- Item 40 : @Override systematique
- Item 41 : Marqueur interfaces vs annotations
Chapitre 7 : Lambdas et Streams (Java 8+)
- Item 42 : Lambdas > classes anonymes
- Item 43 : Method references > lambdas
- Item 44 : Interfaces fonctionnelles standard
- Item 45 : Streams avec prudence
- Item 46 : Preferer les fonctions sans effet de bord dans les streams
- Item 47 : Stream comme type de retour
- Item 48 : Paralleliser les streams avec precaution
Chapitre 8 : Methodes
- Item 49 : Valider les parametres
- Item 50 : Defensive copies
- Item 51 : Signature de methode
- Item 52 : Surcharge intelligente
- Item 53 : Varargs avec prudence
- Item 54 : Collections vides plutot que null
- Item 55 : Optionals comme types de retour
- Item 56 : Javadoc pour toutes les API
Chapitre 9 : Programmation generale
- Item 57 : Portee minimale des variables locales
- Item 58 : for-each > for avec index
- Item 59 : Bibliotheques standard > reimplementation
- Item 60 : Eviter float/double pour les calculs exacts
- Item 61 : Boxing types avec prudence
- Item 62 : Strings pour les types appropries
- Item 63 : Concat vs StringBuilder
- Item 64 : Interfaces comme types
- Item 65 : Reflection pour l'infrastructure seulement
- Item 66 : Methodes natives avec prudence
- Item 67 : Optimisation avec parcimonie
- Item 68 : Conventions de nommage
Chapitre 10 : Exceptions
- Item 69 : Exceptions pour les conditions exceptionnelles
- Item 70 : Exceptions checked vs unchecked
- Item 71 : Eviter l'usage inutile des checked exceptions
- Item 72 : Standardiser l'usage des exceptions
- Item 73 : Exception qui preserve l'abstraction
- Item 74 : Documentation des exceptions
- Item 75 : Messages d'erreur detailles
Chapitre 11 : Concurrence
- Item 76 : Synchroniser l'acces aux donnees partagees
- Item 77 : Eviter les synchronisations excessives
- Item 78 : Executors, tasks, streams > threads
- Item 79 : Eviter les synchronisations dans les callbacks
- Item 80 : Preferer les executors, timers
- Item 81 : Preferer les utilitaires de concurrence (java.util.concurrent)
- Item 82 : Thread safety documentee
- Item 83 : Initialisation paresseuse avec prudence
- Item 84 : Eviter les thread groups
Chapitre 12 : Serialisation
- Item 85 : Alternatives a la serialisation Java
- Item 86 : Serializable avec precaution
- Item 87 : Personnaliser la serialisation
- Item 88 : readObject defensive
- Item 89 : Singleton avec enum
- Item 90 : Serialization proxy
Top takeaways pour l'ingenieur moderne
- Records et Sealed classes (Java 17+) simplifient enormement les items sur equals/hashCode/heritage
- Optional (Item 55) est la solution moderne aux nulls
- Streams (Item 45-48) doivent etre utilises avec discernement
- try-with-resources (Item 9) est systematique
- Builder pattern (Item 2) reste pertinent malgre les records
- Lambdas (Item 42) remplacent les classes anonymes
2. Java Concurrency in Practice — Brian Goetz
Presentation
- Auteurs : Brian Goetz (spec lead), Tim Peierls, Joshua Bloch
- Edition : 2006 (toujours d'actualite pour les fondamentaux)
- Pages : 384
- Note : 4.7/5 — Reference concurrency Java
Structure
Partie 1 : Fondamentaux
- Thread Safety — Atomicite, visibilite, ordre
- Partage d'objets — Publication, immutabilite, safe publication
- Composition — Delegation, thread-safe classes
- Blocs de construction — Synchronized collections, concurrent collections
Partie 2 : Structurer les applications concurrentes
- Blocs de construction — Latches, barriers, semaphores
- Task execution — ExecutorService, thread pools
- Cancellation et shutdown — Interruption, flags
- Thread pools — Taille, configuration, saturation
- GUI applications — Event dispatch thread
Partie 3 : Performance et test
- Performance — Cout du locking, scalability, Amdahl
- Tests — Tests d'atomicite, tests de performance
Partie 4 : Themes avances
- Cas explicites de synchronisation — ReentrantLock, ReadWriteLock
- Atomiques et non-bloquants — CAS, AtomicInteger, volatiles
- Modeles memoire — happens-before, reordering, visibility
Takeaways pour Java 21+
- Virtual threads (Loom) simplifient radicalement le modele de concurrence
- Structured concurrency (JEP 453) rend le code concurrent plus sur
- Scoped values (JEP 446) remplacent ThreadLocal
- Les fondamentaux de Goetz restent valables pour comprendre le modele memoire
- AtomicInteger, ReentrantLock, CountDownLatch toujours d'actualite
3. Spring in Action (6th Edition) — Craig Walls
Presentation
- Auteur : Craig Walls (VMware)
- Edition : 6e (2022), couvre Spring Boot 3.x
- Pages : 520
- Note : 4.6/5 — Guide pratique Spring
Resume par chapitre
Partie 1 : Fondamentaux Spring
- Getting started — Spring Boot, Initializr, premiere app
- Web avec Spring MVC — Controllers, REST, validation
- Donnees avec Spring — JdbcTemplate, Spring Data JPA
- Spring Security — Authentification, autorisation
Partie 2 : Spring Boot en pratique
- Configuration — Properties, profiles, externalized config
- Actuators — Health, metrics, info endpoints
- Deploiement — JAR, WAR, Docker, Cloud
Partie 3 : Reactive Spring
- Reactive — Reactor, WebFlux, reactive data
- Reactive REST — WebClient, reactive repositories
Partie 4 : Cloud Native
- Cloud — 12-factor app, Config, Discovery
- Resilience — Circuit Breaker, Retry, Fallback
- Tracing — Distributed tracing, monitoring
Partie 5 : Deploiement et operations
- Kubernetes — Deploiement Spring sur K8s
- Native — Spring Boot 3 + GraalVM native images
- Testing — JUnit 5, Mockito, Testcontainers, Selenium
Takeaways
- Spring Boot 3.x requiert Java 17 minimum
- La configuration auto est puissante mais doit etre comprise
- Les actuators sont indispensables en production
- GraalVM native image reduit le demarrage de 5s a 100ms
- Spring Security 6.0 a change : SecurityFilterChain remplace WebSecurityConfigurerAdapter
4. Clean Code — Robert C. Martin
Presentation
- Auteur : Robert C. Martin ("Uncle Bob")
- Edition : 2008
- Pages : 464
- Note : 4.2/5 — Classique, parfois idealiste mais fondamental
Resume par chapitre
- Clean Code — Qu'est-ce que le code propre
- Noms significatifs — Intention-revealing names
- Fonctions — Petites, une responsabilite
- Commentaires — Le commentaire ment, le code reste
- Formatage — Vertical/horizontal formatting
- Objets et structures — Data/Object anti-symmetry
- Gestion des erreurs — Exceptions, null handling
- Limites — Integrating third-party code
- Tests unitaires — TDD, F.I.R.S.T. principles
- Classes — Organisation, cohesion
- Systemes — Separation of concerns
- Emergence — Simple design rules
- Concurrence — Thread safety tips
- Refactoring — Successive refinement
Principles F.I.R.S.T. pour les tests
- Fast — Tests rapides
- Independent — Tests independants
- Repeatable — Reproductibles
- Self-validating — Auto-validation (boolean)
- Timely — Ecrits au bon moment (TDD)
Application Java moderne
- Les records Java 21 rendent les classes de donnees beaucoup plus propres
- Les lambdas reduisent le bruit syntaxique
- Les Optional eliminent les null checks
- Les streams rendent les boucles plus declaratives
- Les methodes par defaut dans les interfaces evite les classes abstractes inutiles
5. Design Patterns (GoF) — Gamma, Helm, Johnson, Vlissides
Presentation
- Auteurs : Gang of Four (GoF)
- Edition : 1994 (toujours la reference)
- Pages : 416
- Note : 4.5/5 — Pattern design intemporels
Application Java moderne
Patterns creationnels
| Pattern | Java 21 expression |
|---|---|
| Singleton | enum Singleton { INSTANCE } (Bloch Item 3) |
| Factory | Supplier<T>, method references |
| Builder | Lombok @Builder, Records avec builder |
| Prototype | Records .copy() mecanique |
Patterns structurels
| Pattern | Java 21 expression |
|---|---|
| Adapter | Method references, lambdas |
| Decorator | Collections.unmodifiableList(), streams |
| Proxy | InvocationHandler, Spring AOP, CDI |
| Composite | Arbres avec records et sealed interfaces |
| Facade | Spring @Service facade |
Patterns comportementaux
| Pattern | Java 21 expression |
|---|---|
| Strategy | Function<T,R>, lambdas |
| Observer | Flow.Publisher/Subscriber, Reactor |
| Command | Runnable, Callable, lambdas |
| Iterator | Stream.iterator(), for-each |
| Template Method | Default interface methods |
| State | Sealed classes + pattern matching |
| Visitor | Pattern matching + sealed classes |
Pattern Matching comme "Visitor eliminator"
Avec sealed classes et pattern matching (Java 21), le Visitor pattern peut etre remplace :
sealed interface Shape permits Circle, Rectangle {}
record Circle(double radius) implements Shape {}
record Rectangle(double width, double height) implements Shape {}
double area(Shape shape) {
return switch (shape) {
case Circle c -> Math.PI * c.radius() * c.radius();
case Rectangle r -> r.width() * r.height();
};
}
Plus besoin du Visitor traditionnel. Le pattern matching + sealed classes est plus propre, plus type-safe, et plus maintenable.
6. Domain-Driven Design — Eric Evans
Presentation
- Auteur : Eric Evans ("Eric Evans")
- Edition : 2003 (reste la reference DDD)
- Pages : 560
- Note : 4.2/5 — Complexe mais transformateur
Les 4 couches DDD
- Ubiquitous Language — Langage commun equipe/domaine
- Bounded Context — Limites explicites du modele
- Entities — Objets avec identite continue
- Value Objects — Objets definis par leurs attributs
Tactical Patterns
- Entity :
@EntityJPA, identite, mutable - Value Object :
record, immutable - Aggregate : Cluster de coherence transactionnelle
- Repository :
JpaRepository<T,ID> - Domain Service : Logique sans etat
- Domain Event : Evenements du domaine
- Factory : Creation d'objets complexes
- Specification : Regles metier reutilisables
Application avec Spring Boot
// Value Object
public record Money(BigDecimal amount, Currency currency) {
public Money {
if (amount.compareTo(BigDecimal.ZERO) < 0)
throw new IllegalArgumentException("Negative amount");
}
public Money add(Money other) {
if (!this.currency.equals(other.currency))
throw new IllegalArgumentException("Currency mismatch");
return new Money(this.amount.add(other.amount), this.currency);
}
}
// Entity
@Entity
public class Order {
@Id @GeneratedValue
private Long id;
@Embedded
private Money total;
@Enumerated(EnumType.STRING)
private OrderStatus status;
@OneToMany(cascade = CascadeType.ALL)
private List<OrderLine> lines;
public void addProduct(Product product, int quantity) {
OrderLine line = new OrderLine(product, quantity);
lines.add(line);
total = total.add(line.subtotal());
}
}
// Aggregate Root
// L'Order est l'Aggregate Root. Toute modification passe par l'Order.
// Les OrderLine ne sont accessibles que via l'Order.
// Domain Service
@Service
public class PricingService {
public Money calculatePrice(Order order, Customer customer) {
Money basePrice = order.getTotal();
if (customer.isPremium()) {
return basePrice.applyDiscount(0.10);
}
return basePrice;
}
}
// Domain Event
public record OrderConfirmedEvent(Long orderId, LocalDateTime confirmedAt) {}
Hexagonal Architecture avec DDD
[Controllers] → [Application Services] → [Domain] → [Repository Interfaces]
↓
[Repository Implementations]
↓
[Database/JPA]
DDD + architecture hexagonale = separation parfaite entre domaine et infrastructure.
Conclusion : Par ou commencer ?
| Livre | Priorite | Temps de lecture | Pour qui ? |
|---|---|---|---|
| Effective Java | ★★★★★ | 4-6 semaines | Tous niveaux |
| Clean Code | ★★★★ | 2-3 semaines | Juniors |
| Spring in Action | ★★★★★ | 3-4 semaines | Devs Spring |
| Java Concurrency | ★★★★ | 4-6 semaines | Seniors |
| Design Patterns | ★★★★ | 4-8 semaines | Intermediaire+ |
| Domain-Driven Design | ★★★★ | 6-12 semaines | Architectes |
Lecture recommandee : Effective Java d'abord, puis Spring in Action, puis Clean Code, puis DDD/GoF/JCIP selon les besoins.