// PendingReservation.java
publicclassPendingReservationimplements WithResources {/* à compléter */publicPendingReservation(String title,int durationInMinutes){/* à compléter */}publicPendingReservation(String title,int durationInMinutes, List<Resource> resources){/* à compléter */}public Reservation scheduleAt(LocalDateTime dateTime){/* à compléter */if( resouces().isEmpty()){thrownew IllegalStateException("A reseravtion should have at least one resource");}/* à compléter */}public List<Resource>resources(){/* à compléter */}publicbooleanisInConflictWithIfScheduledAt(Reservation other, LocalDateTime dateTime){/* à compléter */}/* complétez toString, hashCode et equals */}
// Reservation.java
/* NOTE
* Une réservation doit être immutable. Une fois crée, il doit être impossible de modifier son état
*/publicclassReservationimplements WithResources {/* à compléter */publicReservation(String title, LocalDateTime dateTime,int durationInMinutes){/* à compléter */}publicReservation(String title, LocalDateTime dateTime,int durationInMinutes, List<Resource> resources){this(dateTime, durationInMinutes);if(resources.isEmpty()){thrownew IllegalStateException("A reseravtion should have at least one resource");}this.resources= List.copyOf(resources);}public Reservation moveTo(LocalDateTime dateTime){/* à compléter *//* retourne une nouvelle version de la réservation à la date donnée */}public PendingReservation postpone(){/* ajourne la réservation, annule sa planification *//* à compléter */}public Reservation withNewTitle(String newTitle){/* à compléter */}public Reservation withNewDurationInMinutes(int durationInMinutes){/* à compléter */}public Reservation withResources(List<Resource> newResources){/* à compléter */if(resources.isEmpty()){thrownew IllegalStateException("A reseravtion should have at least one resource");}/* à compléter */}public List<Resource>resources(){/* à compléter */}publicbooleanisInConflictWith(Reservation other){/* à compléter */}/* complétez toString, hashCode et equals */}
Pour l’instant, le seul état invalide qui ne peut être détecté à la compilation est l’obligation d’une réservation à posséder au moins une ressource. Nous verrons comment faire mieux lorsque nous aborderons les Optional (valeurs optionnelles).
L’avantage d’une classe immutable, pour notre réservation planifée, et de garantir qu’elle sera toujours valide. Il est possible de retourner une version modifiée en chaînant les appels de méthodes: Reservation newVersion = aReservation.withNewTitle("Cours de prog. séq.").moveTo(newDate).withNewDuration(90);