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é.
On souhaite créer des objets permettant de représenter des voitures. Toutes les classes seront écrites dans un package fr.uge.rental. On écrira une méthode main dans une classe Main pour faire les tests.
Une voiture (Car) est définie par un modèle (une chaîne de caractères model) ainsi qu’une année de fabrication year. De plus, elle peut être tout-terrain ou non (booléen offRoad). Indiquer le code de Car.
Ajouter un constructeur ne prenant en paramètre que le modèle et l’année pour créer des voitures qui ne sont pas tout-terrain par défaut.
Ajouter de quoi afficher une voiture de la façon suivante :
var mustang = new Car("Ford Mustang", 2014); System.out.println(mustang); // Car Ford Mustang, 2014 model (off-road: no) var beetle = new Car("Coccinelle", 1985, true); System.out.println(beetle); // Car Coccinelle, 1985 model (off-road: yes) ...Attention à bien avoir exactement le même affichage !
Écrire une classe Rental qui représente une agence de location de voitures et qui stocke les voitures qui peuvent être louées dans une liste, qui peut être modifiée. Une voiture pourra figurer plusieurs fois dans la liste. De plus, l'agence est créé avec une année courante (currentYear) non modifiable.
Ajouter ce qu’il faut pour pouvoir créer un Rental à partir de l’année courante.
... var rental = new Rental(2023); ...
Écrire une méthode add qui permet d’ajouter une voiture à l’agence.
... var ds = new Car("Citroen DS", 1970); rental.add(mustang); rental.add(beetle); rental.add(ds); ...
Ajouter de quoi afficher l’agence avec l’année courante suivie de double tirets puis toutes les voitures qu’elle peut louer, séparées par des tirets. L’implantation doit utiliser un stream.
... System.out.println(rental); // Rental (2023) // ===== // Car Ford Mustang, 2014 model (off-road: no) // ----- // Car Coccinelle, 1985 model (off-road: yes) // ----- // Car Citroen DS, 1970 model (off-road: no) ...Attention à bien avoir exactement le même affichage !
Le coût d’entretien d’une voiture dépend de son année de fabrication. Plus elle est récente plus elle coûte cher :
... System.out.println(mustang.careCost()); // 240 System.out.println(beetle.careCost()); // 150 ...
Écrire une méthode totalCareCost permettant de calculer le coût total d’entretien des voitures que possède une agence de location. L’implantation doit utiliser un stream.
System.out.println(rental.totalCareCost()); // 490
Pour attirer plus de clients, une agence de location peut désormais proposer des limousines (Limousine) qui possède les caractéristiques suivantes (model, year, ainsi qu'un nombre de places (nbSeats).
... var limo = new Limousine("Cadillac", 2012, 13); ...
Les limousines ont un coût d’entretien de 600 euros plus, si la limousine a été fabriquée après 2000, 10 euros de plus par année après 2000. Écrire une méthode pour calculer le coût d’entretien d’une limousine.
... System.out.println(limo.careCost()); // 720 ...
Ajouter de quoi afficher une limousine ainsi :
... System.out.println(limo); // Limousine Cadillac, 2012 model, number of seats: 13 ...Attention à bien avoir exactement le même affichage !
On souhaite pouvoir ajouter une limousine dans la liste des véhicules d’une agence. Modifier le code pour que Rental continue de fonctionner correctement. L’implantation de totalCareCost doit toujours utiliser un stream.
... rental.add(limo); System.out.println(rental.totalCareCost()); ...
Dans le but d'établir un inventaire, on souhaite pouvoir compter tous les véhicules en fonction de leur année. Pour cela, on va écrire la méthode countInYears(function) avec function une fonction qui prend en paramètre une année et indique si oui ou non le véhicule qui a cette année doit être compté.
Voici un exemple d'utilisation
... System.out.println(rental.countInYears(year -> year >= 1950 && year <= 2000)); // 2 ...Attention de bien typé correctement la fonction prise en paramètre de countInYears(function).
Toujours pour attirer les clients, l’agence souhaite éditer une brochure publicitaire où elle fera figurer ses véhicules les plus intéressants par catégorie:
System.out.println(rental.allNice(Category.LESS_THAN_20_YEARS)); // [Car Ford Mustang, 2014 model (off-road: no), Limousine Cadillac, 2012 model, number of seats: 13] System.out.println(rental.allNice(Category.ALL_FORD)); // [Car Ford Mustang, 2014 model (off-road: no)]
Pour que la brochure soit encore plus attrayante, on ajoute les catégories
System.out.println(rental.allNice(Category.OFF_ROAD)); // [Car Coccinelle, 1985 model (off-road: yes)] System.out.println(rental.allNice(Category.BIG_LIMO)); // [Limousine Cadillac, 2012 model, number of seats: 13]Ajouter les deux nouvelles catégories à l'enum et faite les changements correspondants sachant que l'on vous demande de ne pas utiliser le polymorphisme (et pas de instanceof bien sûr).
L’agence souhaite maintenant disposer d’un accès rapide à tous les véhicules qui ont la même année de fabrication. Écrire une méthode vehiclesByYear qui renvoie une map associant à chaque année de fabrication la liste des véhicules (voitures ou limousines) qui ont cette année de fabrication. On doit utiliser des stream.
... System.out.println(rental.vehiclesByYear()); // {1985=[Car Coccinelle, 1985 model (off-road: yes)], 1970=[Car Citroen DS, 1970 model (off-road: no)], 2012=[Limousine Cadillac, 2012 model, number of seats: 13], 2014=[Car Ford Mustang, 2014 model (off-road: no)]} ...
L’agence souhaite aussi disposer d’un accès rapide à toutes les voitures (les Car) qui ont la même année de fabrication. Écrire une méthode carsByYear qui renvoie une map associant à chaque année de fabrication une liste de véhicules qui contient (uniquement les voitures (pas les limousines) qui ont cette année de fabrication. On doit utiliser des stream.
... System.out.println(rental.carsByYear()); // {1985=[Car Coccinelle, 1985 model (off-road: yes)], 1970=[Car Citroen DS, 1970 model (off-road: no)], 2014=[Car Ford Mustang, 2014 model (off-road: no)]} ...
Enfin, pour les plus balèzes, dans le but de simplifier le code de la méthode allNice(category) et écrire une nouvelle méthode allNice(function) tel que le code ci-dessous fonctionne, puis simplifier le code de la méthode allNice(category).
... System.out.println(rental.allNice(_ -> true)); // [Car Ford Mustang, 2014 model (off-road: no), Car Coccinelle, 1985 model (off-road: yes), Car Citroen DS, 1970 model (off-road: no), Limousine Cadillac, 2012 model, number of seats: 13]