:: Enseignements :: Licence :: L3 :: 2021-2022 :: Programmation Objet avec Java ::
[LOGO]

Revision


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é.

Exercice 1 - Hôtels et Appartements

Le but de ce premier exercice est d'implanter une classe AssetManager permettant de gérer des hôtels (Hotel) et des appartements (Apartment).
Toutes les classes créées doivent être créées dans le package fr.umlv.monopoly.

  1. É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.
  2. É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().
  3. 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.
  4. É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.
  5. 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.
  6. 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.
  7. 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.
  8. 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.