IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Penser en Java 2nde édition - Sommaire |  Préface |  Avant-propos | Chapitre : 1  2  3  4  5  6  7  8  9  10  11  12  13  14  15 |  Annexe : A B C D  | Tables des matières - Thinking in Java

  A) Passage et Retour d'Objets

pages : 1 2 3 4 5 6 

Les solutions aux exercices sélectionnés peuvent être trouvées dans le document électronique The Thinking in Java Annotated Solution Guide, disponible pour une faible somme sur www.BruceEckel.com.

  1. Démontrer un second niveau d'aliasing. Créer une méthode qui crée une référence sur un objet mais ne modifie pas cet objet. Par contre, la méthode appelle une seconde méthode, lui passant la référence, et cette seconde méthode modifie l'objet.
  2. Créer une classe myString contenant un objet String qu'on initialisera dans le constructeur en utilisant l'argument du constructeur. Ajouter une méthode toString() et une méthode concatenate() qui ajoute un objet String à la chaîne interne. Implémenter clone() dans myString. Créer deux méthodes static acceptant chacune une référence myString x comme argument et appellant x.concatenate("test"), mais la seconde méthode appelle clone() d'abord. Tester les deux méthodes et montrer les différents effets.
  3. Créer une classe Battery contenant un int qui est un numéro de batterie (comme identifiant unique). La rendre cloneable et lui donner une méthode toString(). Créer maintenant une classe Toy qui contienne un tableau de Battery et une méthode toString() qui affiche toutes les Battery. Ecrire une méthode clone() pour la classe Toy qui clone automatiquement tous ses objets Battery. Tester cette méthode en clonant Toy et en affichant le résultat.
  4. Changer CheckCloneable.java afin que toutes les méthodes clone() interceptent l'exception CloneNotSupportedException plutôt que de la faire suivre à l'appelant.
  5. En utilisant la technique de la classe compagnon modifiable, créer une classe immuable contenant un int, un double et un tableau de char.
  6. Modifier Compete.java pour ajouter de nouveaux objets membres aux classes Thing2 et Thing4, et voyez si vous pouvez déterminer comment le minutage varie avec la complexité - si c'est une simple relation linéaire ou si cela semble plus compliqué.
  7. En reprenant Snake.java, créer une version du serpent qui supporte la copie profonde.
  8. Hériter d'une ArrayList et faire que sa méthode clone() réalise une opération de copie profonde.

[79]En C, qui généralement gère des données de petite taille, le passage d'arguments par défaut se fait par valeur. C++ a dû suivre cette norme, mais avec les objets, le passage par valeur n'est pas la façon de faire la plus efficace. De plus, coder une classer afin qu'elle supporte le passage par valeur en C++ est un gros casse-tête.

[80]Ce n'est pas l'orthographe correcte du mot clonable (N.d.T. : en français comme en anglais), mais c'est de cette manière qu'il est utilisé dans la bibliothèque Java ; j'ai donc décidé de l'utiliser ainsi ici aussi, dans l'espoir de réduire la confusion.

[81]On peut apparemment créer un simple contre-exemple de cette affirmation, comme ceci :

public class Cloneit implements Cloneable {
  public static void main (String[] args)
  throws CloneNotSupportedException {
    Cloneit a = new Cloneit();
    Cloneit b = (Cloneit)a.clone();
  }
}

Toutefois, ceci ne marche que parce que main( ) est une méthode de Cloneit et donc a la permission d'appeler la méthode protected clone() de la classe de base. Si on l'appelle depuis une autre classe, la compilation générera des erreurs.

[82]L'avocat excepté, qui a été reclassifié en « aliment gras ».

[83]C++ permet au programmeur de surcharger les opérateurs comme il l'entend. Comme ceci se révèle souvent être un processus compliqué (voir le Chapitre 10 de Thinking in C++, 2nd edition, Prentice-Hall, 2000), les concepteurs de Java ont jugé une telle fonctionnalité « non souhaitable » qui ne devait pas donc pas être intégrée dans Java. Elle n'était apparemment pas si indésirable que cela, puisqu'eux-mêmes l'ont finalement utilisée, et ironiquement, la surcharge d'opérateurs devrait être bien plus facile à utiliser en Java qu'en C++. On peut le voir dans Python (voir www.python.org) qui dispose d'un ramasse-miettes et d'un mécanisme de surcharge d'opérateurs très simple à mettre en oeuvre.

[84]Doug Lea, qui m'a été d'une aide précieuse sur ce sujet, m'a suggéré ceci, me disant qu'il créait simplement une fonction duplicate() pour chaque classe.

Ce livre a été écrit par Bruce Eckel ( télécharger la version anglaise : Thinking in java )
Ce chapitre a été traduit par Jérome Quelin ( groupe de traduction )
télécharger la version francaise (PDF) | Commandez le livre en version anglaise (amazon) | télécharger la version anglaise
pages : 1 2 3 4 5 6 
Penser en Java 2nde édition - Sommaire |  Préface |  Avant-propos | Chapitre : 1  2  3  4  5  6  7  8  9  10  11  12  13  14  15 |  Annexe : A B C D  | Tables des matières - Thinking in Java