Date de première publication : 2010/05/19
Nous avons manipulé différents types de constructeurs en Java : constructeur sans argument (qui se rapproche un peu du constructeur par défaut du C++), des constructeurs personnalisés mais il n’existe pas de constructeur de copie qui permette de créer un nouvel élément à partir d’un ancien comme en C++. La solution pour créer un nouvel objet est de cloner celui-ci.
Pour tester le clonage, je vous propose de nous plonger dans un milieu expert : la guerre des clones de Star Wars. This is the way !
Mise en place des classes : Trooper, Arme (Fusil ou Pistolet), Ceinture, Grade
Créer une classe Trooper
avec différents attributs
(pour les tests, on peut briser l’encapsulation et les mettre publics) :
- Un identifiant qui permet de singulariser le clone. Tout nouvel objet de la classe
Trooper
aura un identifiant différent des autres (utiliser par exemple une variable de classe compteur) - Un nom : le plus souvent, le nom sera directement lié à l'identifiant de clonage mais certains clones (les gradés ou ceux qui ont un esprit d'initiative plus avancé que la moyenne) ont un petit nom. Parmi les plus connus, on trouve : Cody, Mort, Gree , Baccara, Appo, Neyo, ... On mettra comme nom par défaut "Clone de Jango Fett #identifiant"
- Un niveau de santé : un entier aléatoire entre 50 et 100.
- Une
Arme
qui est soit unFusil
(le célèbre Blaster DC 15), soit unPistolet
. On dotera l’arme d’un numéro de série.
La classe Arme
est une classe abstraite avec un numéro de série. Le numéro de série (un entier) est fixé à la construction et consultable avec une méthode getSerie()
.
Les classes Fusil
et Pistolet
dérivent simplement de la classe Arme
.
Les constructeurs de Fusil
et Pistolet
appellent celui d'Arme
.
- Une
Ceinture
qui peut contenir : un kit médical, des munitions supplémentaires, un grappin, des grenades, une radio, ... Vous coderez cette classe plus tard (il faudrait avoir vu les collections) - Un
Grade
: comme tout corps armé hiérarchisé, les Troopers ont un grade (à voir également quand vous aurez fait le cours).
Les grades sont les suivants (repérés originellement avec la couleur précisée en paramètre) :
- Trooper ou simple soldat (BLANC)
- Sergent qui dirige une squad de 9 troopers (VERT)
- Lieutenant qui dirige un platoon soit 36 troopers (BLEU)
- Capitaine, une compagnie de 144 troopers (ROUGE)
- Commandeur pour un régiment de 2304 troopers (JAUNE)
Je vous propose de coder l’information avec une énumération. Il faut définir une méthode
getMarque()
qui renvoie la couleur liée au grade comme le montre le code incomplet suivant :
enum Grade {
TROOPER {
public String getMarque() { return "WHITE"; }
},
SERGENT {
// ...
};
abstract public String getMarque();
}
Ajouter une méthode toString()
à la classe Trooper
, qui affichera l'identifiant,
le nom, le niveau de santé, l’arme et le grade du Trooper.
Mettez les constructeurs qui vous semblent nécessaires (sans duplication de code : un constructeur peut en appeler un autre)
L’expérience génétique des Kaminoans
- Créer un commandeur "Cody". L’afficher sur la console.
- Ajouter une méthode
clone()
à la classeTrooper
comme vu en cours et rappelé ci-dessous :
class Trooper implements Cloneable {
public Object clone() {
Trooper object = null;
try {
object = (Trooper) super.clone();
} catch(CloneNotSupportedException cnse) {
cnse.printStackTrace(System.err);
}
// s'occuper des attributs "compliqués"
// si object est non null
// MAIS PAS TOUT DE SUITE
// uniquement quand on vous le demande
return object;
}
}
- Créer un clone et l’afficher sur la console.
- Modifier le nom du clone ("Mort" par exemple), le numéro de série de l’arme, abaisser le niveau de santé à 49.
- Afficher l'original et le clone. Que remarquez-vous ? Le phénomène est connu sous le nom de copie de surface.
Le nom du clone est bien changé sans répercussion sur l'original car les String
sont immutables. Les niveaux de santé sont bien distincts car il s'agit d'un entier. L'arme du clone et l'arme de l'original ont encore le même numéro de série : le clonage a créé deux clones qui partagent la même arme.
- Créer une deuxième version de la classe
Trooper
,Trooper2
, qui dérive deTrooper
et qui corrige ce phénomène. - Si la ceinture est une liste chaînée initialisée avec différents éléments, que se passe-t-il au clonage ?
Surface ou profondeur ?
Toutes ces informations militaires ultra secrètes proviennent de :