Ce TP est à faire seul, un peu dans les conditions d'un examen. Bien sûr,
cela reste un TP, donc n'hésitez pas à appeler le chargé de TP si vous êtes bloqué.
-
Écrire une classe ou un record Hotel défini par un nombre de chambres à louer (rooms) ainsi
qu'une valeur d'efficacité (efficiency) correspondant au taux d'occupation de l'hôtel
(donc une valeur en pourcentage représentée par un flottant entre 0 et 1).
La méthode d'affichage d'un hôtel doit afficher "Hotel" suivi du nombre de chambres et
de l'efficacité, afin que le code suivant fonctionne :
var hotel = new Hotel(5, 0.75);
System.out.println(hotel); // Hotel 5 rooms 0.75
Note : attention à ne pas permettre de créer des objets Hotel invalides.
-
Écrire une classe ou un record Apartment définie par un entier area indiquant le nombre
de m2 de l'appartement ainsi qu'une liste de personnes vivant dans l'appartement.
Il y a au moins une personne par appartement.
La méthode d'affichage d'un appartement doit afficher "Apartment" suivi du nombre de m2 puis
du nom de chaque personne y vivant, séparés par des virgules et enfin du pourcentage d'efficacité.
Pour un appartement donné, le nombre de personnes dans un appartement ne doit pas changer (en pratique, cela veut dire qu'on supprime l'appartement pour en créer un nouveau
si les personnes d'un appartement changent).
Le pourcentage d'efficacité est 0.5 si il y a une personne et 1.0 si il y a plus d'une personne.
Voici un exemple :
var apartment = new Apartment(30, List.of("Bony", "Clyde"));
System.out.println(apartment); // Apartment 30 m2 with Bony, Clyde 1.0
Note : attention à ne pas permettre de créer des objets Apartment invalides.
Note2 : pour afficher les noms des personnes séparés par des virgules, utiliser un Stream et
un appel à Collectors.joining().
-
Vérifier que le code suivant ne permet pas de créer un appartement vide
et ajouter une copie défensive à votre code si vous ne l'avez pas déjà fait.
var list = new ArrayList<String>();
list.add("Bob");
var apartment2 = new Apartment(50, list);
list.remove("Bob");
System.out.println(apartment2); // Apartment 50 m2 with Bob 0.5
Note : l'idée d'une copie défensive est de faire une copie des objets mutables dans le constructeur
pour éviter que l'état de l'objet change après création, si on change l'objet mutable
ayant servi à le construire.
-
Écrire une classe ou un record AssetManager pour gérer un ensemble d'hôtels et d’appartements. Le code suivant doit afficher le profit par nuit
qui est la somme des prix par nuits des hôtels et des appartements de l'AssetManager, sachant que le prix par nuit pour un appartement est 20 euros par personne et
que pour un hôtel c'est 100 euros par chambre, le tout multiplié par l'efficacité.
var hotel = new Hotel(5, 0.75);
var apartment = new Apartment(30, List.of("Bony", "Clyde"));
var manager = new AssetManager();
manager.add(hotel);
manager.add(apartment);
System.out.println(manager.profitPerNight()); // 415
Note : utiliser un Stream pour écrire la méthode profitPerNight.
-
On souhaite que la méthode add de la classe AssetManager n'accepte que
des appartements et des hôtels et pas d'autres types.
Modifier le code en conséquence.
-
Désormais, on souhaite que lors de l'affichage d'un AssetManager
les appartements et les hôtels soient affichés, un par ligne,
dans le même ordre que l'ordre des appels à add.
Par exemple
var hotel = new Hotel(5, 0.75);
var apartment = new Apartment(30, List.of("Bony", "Clyde"));
var manager = new AssetManager();
manager.add(hotel);
manager.add(apartment);
System.out.println(manager); // affiche
// Hotel 5 rooms 0.75
// Apartment 30 m2 with Bony, Clyde 1.0
Note : utiliser un Stream dans votre implantation.
-
On souhaite ajouter une méthode lowestEfficiency qui renvoie une liste
des appartements et des hôtels qui ont une efficacité inférieure ou égale à une valeur
d'efficacité passée en paramètre.
Écrire la méthode lowestEfficiency telle que le code suivant fonctionne
var hotel = new Hotel(5, 0.75);
var apartment = new Apartment(30, List.of("Bony", "Clyde"));
var manager = new AssetManager();
manager.add(hotel);
manager.add(apartment);
System.out.println(manager.lowestEfficiency(0.8)); // [Hotel 5 rooms 0.75]
Note : utiliser un Stream pour implanter la méthode lowestEfficiency.
-
On souhaite enfin ajouter la méthode remove qui permet de supprimer les appartements
et les hôtels dont l'efficacité est inférieure ou égale à une valeur
d'efficacité passée en paramètre.
Par exemple, le code suivant devra fonctionner
var hotel = new Hotel(5, 0.75);
var apartment = new Apartment(30, List.of("Bony", "Clyde"));
var manager = new AssetManager();
manager.add(hotel);
manager.add(apartment);
manager.remove(0.8);
System.out.println(manager); // affiche
// Apartment 30 m2 with Bony, Clyde 1.0
Note : il existe une méthode removeIf sur l'interface java.util.List.