:: Enseignements :: ESIPE :: E4INFO :: 2017-2018 :: Java Avancé ::
[LOGO]

Rappel de notions de programmation objet


Pour l'ensemble des TDs de cette année, nous allons utiliser l'IDE Eclipse (pas de problème si vous voulez en utiliser un autre pourvu qu'il sache faire de la complétion automatique et du refactoring).
Eclipse s'exécute en tapant dans un terminal :
eclipse-light
Après démarrage, vérifiez que vous utilisez le bon JDK : dans Window > Preferences > Java > Installed JREs et assurez-vous que la version est bien compatible avec Java 9.
Puis vérifiez que le compilateur a bien été configuré en mode 9 : dans Window > Preferences > Java > Compiler, le Compiler compliance level doit être à 9

Chaque exercice vient avec des tests unitaires JUnit qui vous permettent de vérifier que votre implantation passe les tests.
JUnit requiert un JAR qui n'est pas installé dans votre projet Java par défaut. Le plus simple est de créer un test JUnit (New -> JUnit Test), de sélectionner JUnit 4 et de laisser faire Eclipse qui vous proposera d'installer le JAR Junit4.
L'autre solution est d'associer la librarie JUnit dans le build path du projet. bouton droit -> Properties -> Java Build Path -> Add Library -> JUnit -> JUnit 4

Exercice 1 - Location de voitures

Le but de cet exercice est de créer un ensemble de classes permettant de gérer une agence de location de voitures.

Les tests JUnit de cet exercice sont RentalTest.java.

  1. Écrire une classe Car dans le package fr.umlv.rental, correspondant à un véhicule qui pourra être loué. Un vehicule est décrit par un modèle (une chaine de caractères) ainsi qu'une année de fabrication.
    Par exemple, une Ford Mustang sera créée de cette façon:
          Car mustang = new Car("ford mustang", 2014)
        
  2. Modifier la classe Car pour que le code suivant affiche le texte "ford mustang 2014".
          System.out.println(mustang);
        
  3. Créer une classe CarRental (toujours dans le package fr.umlv.rental) qui stocke l'ensemble des véhicules qui peuvent être loués dans une liste.
    La classe CarRental doit posséder une méthode add qui permet d'ajouter un véhicule dans la liste.
    Faire en sorte que la liste ne puisse pas contenir null en empêchant d'ajouter des voitures null.
    Pour tester si une valeur est null, vous utiliserez la méthode Objects.requireNonNull().
  4. Écrire une méthode remove qui permet de retirer un véhicule de la liste.
    Que faire si le véhicule n'a pas été préalablement ajouté ?
    Vérifier que le test carRentalAddRemove est valide. Sinon, expliquez quel est le problème et corrigez-le.
  5. Pour visualiser une instance de la classe CarRental, on devra afficher l'ensemble des véhicules de la liste, séparés par des retours à la ligne (mais sans retour à la ligne final !).
    Écrire le code correspondant en utilisant la classe StringBuilder.
  6. Rappeler à quoi sert l'interface Stream en Java, comment obtenir un stream à partir d'une liste, comment marchent les méthodes filter, map et collect et enfin comment peut-on utiliser le collecteur Collectors.joining() pour simplifier l'implantation de la méthode d'affichage que vous venez d'écrire.
  7. On cherche à connaitre toutes les voitures enregistrées dans le CarRental ayant la même année de fabrication.
    Écrire une méthode findAllByYear(int year) qui prend en paramètre une année et renvoie une liste des voitures ayant l'année de fabrication demandée.
    Que doit-on faire si il n'y a pas de voiture correspondant à l'année demandée.
  8. L'application que vous développez doit aussi être vendue en Egypte où malheureusement, il n'est pas rare de manquer d'essence. Pour éviter de mettre la clé sous la porte, les loueurs de voitures ont trouvé une solution de secours en louant aussi des chameaux.
    Modifier le code de votre application pour permettre de louer non plus uniquement des véhicules mais aussi des chameaux, sachant qu'un chameau possède juste une date de naissance et que son affichage est "camel" suivi d'un espace et de sa date de naissance.
    Par exemple, le code suivant devra fonctionner
           CarRental rental = new CarRental();
           rental.add(new Car("ford mustang", 2014));
           rental.add(new Camel(2010));
         

    La méthode findAllByYear devra renvoyer une liste pouvant être constituée de véhicules et de chameaux.
    En terme de design, faire en sorte que si l'on doit ajouter plus tard une classe SpaceShuttle pour gérer les navettes spatiales, alors on n'aura pas à modifier la classe CarRental.
  9. Comment faire pour que la date de fabrication d'un véhicule et de naissance d'un chameau correspondent à un seul et même champ partagé par les classes Car et Camel?
  10. Finalement, est-il vraiment nécessaire d'utiliser une interface?
  11. Les véhicules à louer doivent être assurés. Une voiture de moins de 10 ans coûte 200 euros à assurer et sinon, l'assurance est de 500 euros. Pour un chameau, le prix de l'assurance est proportionnel à son âge, qu'il faut multiplier par 100 euros..
    Écrire dans la classe CarRental, une méthode insuranceCost qui permet de calculer le coût total pour assurer tous les véhicules.
    Attention, l'hypothétique introduction de la classe SpaceShuttle dont le prix d'assurance sera calculé en fonction du nombre de voyages effectués devra aussi se faire sans modifier la classe CarRental.
  12. Enfin, écrire dans la classe CarRental, une méthode findACarByModel qui permet de trouver un véhicule à partir de son modèle passé en paramètre.
    Expliquer de plus pourquoi cette méthode doit retourner un objet de type Optional.