Copy of https://perso.isima.fr/loic/java/exo_jse_clonage.php
tete du loic

 Loïc YON [KIUX]

  • Enseignant-chercheur
  • Référent Formation Continue
  • Responsable des contrats pros ingénieur
  • Référent entrepreneuriat
  • Responsable de la filière F2 ingénieur
  • Secouriste Sauveteur du Travail
mail
loic.yon@isima.fr
phone
(+33 / 0) 4 73 40 50 42
location_on
Institut d'informatique ISIMA
  • twitter
  • linkedin
  • viadeo

[JavaSE] La guerre des clones

 Cette page commence à dater. Son contenu n'est peut-être plus à jour. Contactez-moi si c'est le cas!

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) :

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.

Les grades sont les suivants (repérés originellement avec la couleur précisée en paramètre) :

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

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;
   }
}

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.

Surface ou profondeur ?

Toutes ces informations militaires ultra secrètes proviennent de :