:: Enseignements :: Licence :: L3 :: 2012-2013 :: Programmation Objet avec Java ::
[LOGO]

Objet, référence, égalité, nullabilité, mutabilité


Exercice 1 - Product

On cherche à écrire une classe Product représentant un produit avec un nom, un prix et une description facultative.
  1. Déclarer une classe Product contenant les champs privés name, price et description. Vous apporterez une attention particulière au type de price.
  2. Puis essayer le code suivant dans une méthode main de la classe Product.
    	    Product product = new Product();
    	    System.out.println(product.name+' '+product.price+' '+product.description);
          
    Expliquer.
  3. Créer une classe Main (dans un fichier Main.java) et déplacer le main de la classe Product dans la classe Main.
    Quel est le problème ? Comment peut-on le corriger ?
  4. Rappeler les 4 visibilités possible en Java.
    Pourquoi doit-on toujours déclarer les champs privés sous peine de mort certaine ?
  5. Qu'est ce qu'un accesseur ?
    Sachant qu'il n'y a aucune raison de changer les champs d'un produit une fois celui-ci créer (au moins pour l'instant) Quels sont les acceseurs que l'on doit mettre ici ?
  6. Comment empécher un futur developpeur de modifier la valeur du champ name (ou price, ou description) ?
    Pourquoi est ce important ?
  7. Ajouter un constructeur initialisant (un constructeur initialise, il ne construit pas vraiment) le produit avec un nom (pname) et un prix (pprice) et une description (pdesc).
    Pourquoi le code du main ne fonctionne plus ? Changer celui-ci.
  8. Modifier le constructeur précédent pour que les trois paramètres s'appellent name, price et description. Quel est le problème ? Quel est la solution ?
  9. Ecrire un autre constructeur qui prend juste un nom et un prix mais pas de description.
  10. Comment le compilateur fait-il pour savoir quel constructeur appeler ?
  11. Comment faire maintenant pour que le second constructeur appel le premier ?

Exercice 2 - Liberté, Egalité, Fraternité

En utilisant la classe Product de l'exercise précédent
      Product p = new Product(null, 0);
      System.out.println(p.getName());
     

  1. Qu'affiche le code ci-dessus ?
    Où ce situe le problème ?
    Rappeler pourquoi un code doit arréter de fonctionner si celui-ci est mal utilisé par un développeur.
    Que doit-on faire pour corriger le problème ?
  2. A quoi sert la méthode java.util.Objects.requireNonNull (RTFM) ?
    Comment l'utiliser ici pour empécher de construire un produit avec un nom null ?
    Note, la description pourra rester null.
  3.        Product p1 = new Product("foo", 200);
           Product p2 = p1;
           Product p3 = new Product("foo", 200);
    
           System.out.println(p1==p2);
           System.out.println(p1==p3);
          
    Qu'affiche le code ci-dessus ?
    Pourquoi ?
  4. Ecrire dans la classe Product une méthode isSameAs() (à vous de trouver la signature exacte de la méthode) qui renvoie true si deux produits ont les mêmes prix, nom et description.
    Attention à la comparaison de chaîne de caractères.
  5. La classe java.util.ArrayList correspond à un tableau qui s'agrandi dynamiquement.
    A quoi sert la méthode indexOf (RTFM) ?
  6. Executez le code suivant :
         public static void main(String[] args){
           Product p1 = new Product("foo", 200);
           Product p2 = p1;
           Product p3 = new Product("foo", 200);
    
           ArrayList list = new ArrayList();
           list.add(p1);
           System.out.println(list.indexOf(p2));
           System.out.println(list.indexOf(p3));
         }
         
    Quel est le problème avec les résultats affiché sur la console.
    Note : ici, le compilateur génère un warning au niveau du add. Nous verrons dans les prochains TD comment l'éviter.
  7. Quel méthode de Product est appelée par ArrayList.indexOf (RTFM again) ?
  8. Modifier la classe Product pour que indexOf() fait sur l'ArrayList teste si les deux produits ont les mêmes caractéristique.
  9. Utiliser l'annotation @Override (java.lang.Override) pour vérifier que vous avez bien écrit la signature de la méthode ajoutée à Product.
  10. A quoi sert l'annotation @Override ?

Exercice 3 - Comment afficher un Product ?

On aimerait pouvoir afficher les caractéristiques d'un produit, par le code Java suivant :
      Product product =...
      System.out.println(product);
    
Java sait faire cela, à condition de mettre dans la classe Product une méthode public String toString() (la définition de cette méthode est dans la classe java.lang.Object (RTFM !)) retournant une chaîne de caractères, qu'on construit typiquement à partir des attributs de l'objet.
Rappel: en Java on peut faire un '+' entre une String et n'importe quoi, le résultat est la concatenation entre la String et le n'importe quoi vu comme une chaîne de caractère.

  1. Ecrire cette méthode, pour obtenir par exemple l'affichage suivant :
          foo (2,00 €)
          
    ou s'il y a une description (non null)
          foo (2,00 €) a foo not a bar
          
  2. Peut-on utiliser l'annotation @Override, ici ?

Exercice 4 - Tri à caillou [à la maison]

  1. Ecrire une méthode swap qui échange les valeurs de deux cases d'un tableau. void swap(int[] array,int index1,int index2)
  2. Ecrire une méthode indexOfMin qui renvoie l'index de la valeur minimale d'un tableau.
  3. Modifier la méthode indexOfMin en ajoutant deux index indiquant que l'on cherche l'index du minimum non pas sur tout le tableau mais sur la partie de tableau entre les deux index (le premier inclus, le deuxième exclus).
  4. Ecrire la méthode sort qui prend un tableau d'entier en paramètre et qui trie celui-ci en utilisant pour cela les méthodes indexOfMin et swap.