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

Egalité, nullabilité, mutabilité, affichage


Exercice 1 - Livre

On cherche à écrire un record Book représentant un livre avec un titre et le nom de l'auteur.
  1. Déclarer un record Book avec les composants title et author.
  2. Puis essayer le code suivant dans une méthode main du record Book.
      var book = new Book("Da Vinci Code", "Dan Brown");
      System.out.println(book.title + ' ' + book.author);
          
    Expliquer.
  3. Créer une classe Main (dans un fichier Main.java) et déplacer le main de la classe Book dans la classe Main.
    Quel est le problème ? Comment peut-on le corriger ?
  4. On peut remarquer que le code permet de créer des livres ayant un titre ou un auteur null.
     var weirdBook = new Book(null, "oops");
           

    Comment faire pour éviter ce problème sachant qu'il existe une méthode static requireNonNull dans la classe java.util.Objects.
  5. En fait, on peut simplifier le code que vous avez écrit à la question précédente en utilisant un constructeur compact (compact constructor). Commenter le code précédent et utiliser un constructor compact à la place.
  6. Écrire un autre constructeur qui prend juste un titre et pas d'auteur et ajouter un code de test dans le main.
    On initialisera le champ author avec "<no author>" dans ce cas.
  7. Comment le compilateur fait-il pour savoir quel constructeur appeler ?
  8. On souhaite maintenant pouvoir changer le titre d'un livre déjà existant en utilisant une méthode nommée withTitle qui prend en paramètre le nouveau titre.
    Pourquoi le code suivant ne marche pas ?
      public void withTitle(String title) {
        this.title = title;
      }
          
    Comment faire alors ? (indice comme String.toUpperCase)
    Écrire le code correspondant et ajouter un code de test dans le main.

Exercice 2 - Liberté, Égalité, toString

  1. Qu'affiche le code ci-dessous ?
        var b1 = new Book("Da Java Code", "Duke Brown");
        var b2 = b1;
        var b3 = new Book("Da Java Code", "Duke Brown");
    
        System.out.println(b1 == b2);
        System.out.println(b1 == b3);
          

    Pourquoi ?
  2. Comment faire pour tester si deux objets ont le même contenu ?
    Écrire le code qui affiche si b1 et b2, puis b1 et b3 ont le même contenu.
  3. Écrire une méthode isFromTheSameAuthor() qui renvoie vrai si deux livres sont du même auteur.
    Et vérifier avec les deux livres suivants :
      var book1 = new Book("Da Vinci Code", "Dan Brown");
      var book2 = new Book("Angels & Demons", new String("Dan Brown"));
           
  4. Comment faire pour que le code suivant
            var javaBook = new Book("Da Java Code", "Duke Brown");
            System.out.println(javaBook);
           
    affiche
            Da Java Code by Duke Brown
           
  5. Utiliser l'annotation @Override (java.lang.Override) sur la méthode ajoutée à Book.
  6. A quoi sert l'annotation @Override ?

Exercice 3 - Liberté, equals, Fraternité

Au lieu d'utiliser un record, un étudiant qui aime bien ré-inventer la roue à écrit le code suivant
public class Book2 {
  private final String title;
  private final String author;

  public Book2(String title, String author) {
    this.title = title;
    this.author = author;
  }
  
  public static void main(String[] args) {
    var book1 = new Book2("Da Vinci Code", "Dan Brown");
    var book2 = new Book2("Da Vinci Code", "Dan Brown");
    System.out.println(book1.equals(book2));
  }
}
    
Malheureusement, le main n'a pas le comportement attendu.

  1. Quel est le problème ?
  2. Comment corriger le problème si on s'entête à utiliser une classe ?
    Ne m'oubliez pas le @Override SVP !

Exercice 4 - Tri à caillou [à la maison]

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