:: Enseignements :: Licence :: L3 :: 2024-2025 :: Programmation Objet avec Java ::
![[LOGO]](http://igm.univ-mlv.fr/ens/resources/mlv.png) |
Egalité, nullabilité, mutabilité, affichage
|
Exercice 1 - Livre
-
Créer un fichier BookDemo.java et déclarer un record Book représentant un livre
avec un titre (title) et le nom de l'auteur (author) ainsi qu'un main
qui test que l'on peut créer un livre ayant pour titre "Jurassic Park" par "Mickael Crichton"
puis afficher les champs title et author de ce livre.
-
On peut remarquer que si l'on compile BookDemo.java, avec javac --enable-preview BookDemo.java,
on n'obtient pas un fichier ".class" mais deux !
Après avoir exécuté, javap BookDemo.class que pouvez-vous en déduire ?
Modifier le fichier BookDemo.java pour déclarer explicitement la classe créée par le compilateur.
-
Le fait que l'on ne soit pas obligé de créer une classe englobante est pour l'instant une preview feature,
une fonctionnalité de Java en test qui sera, ou non, ajouter au langage dans le futur.
Nous utilisons actuellement deux autres preview features
-
Historiquement en Java, il n'y avait qu'une seule façon d'écrire un main,
il faut qu'il ait exactement la signature public static void main(String[]).
-
Historiquement en Java, pour l'affichage, on devait utiliser System.out.println au lieu
d'utiliser println (cela permet aussi de spécifier la sortie d'erreur standard avec
System.err à la place de System.out).
Modifier votre code pour qu'il ne soit plus nécessaire de spécifier "--enable-preview" ni à la compilation
ni à l'exécution.
-
On peut remarquer qu'il est possible de créer des livres ayant un titre ou un auteur null,
comment éviter cela ?
-
Si vous ne l'avez pas déjà fait à la question précédente, 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.
-
On souhaite que l'on puisse utiliser le record Book pas uniquement dans la classe BookDemo,
pour cela, on va déplacer le record Book dans son propre fichier Book.java.
Une fois cela fait, si on ajoute le code suivant dans le main
public static void main(String[] args) {
...
var book2 = new Book("Jurassic Park", "Mickael Crichton");
println(book2.title + " " + book2.author);
}
le code ne compile plus !
Pourquoi et comment corriger le problème ?
Comment peut-on corriger ce problème ?
-
É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.
-
Comment le compilateur fait-il pour savoir quel constructeur appeler ?
-
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
Créer une classe
BookDemo2 avec un
main sans utiliser de
preview features :
-
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 ?
-
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.
-
É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"));
-
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
-
Utiliser l'annotation @Override (java.lang.Override)
sur la méthode ajoutée à Book.
-
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.
-
Quel est le problème ?
-
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]
On souhaite écrire un tri caillou, le tri à bulle inversé.
Dans cet exercice, vous êtes libre d'utiliser ou non les
preview features.
Dans un fichier
RockSort.java :
-
Écrire une méthode swap qui échange
les valeurs de deux cases d'un tableau :
void swap(int[] array,int index1,int index2)
-
Écrire une méthode indexOfMin qui
renvoie l'indice de la valeur minimale d'un tableau.
-
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).
-
É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.
© Université de Marne-la-Vallée