Vous aimez ce que vous lisez sur ce blog ?
Envie d'aller plus loin avec véritable formation d'expertise en Java ?
Venez suivre ma formation Masterclasse Expertise Java !

"Même un développeur experimenté a besoin de continuer à apprendre. Et dans cette formation... j'ai appris beaucoup !" - A.G., Java Champion

Sessions intra-entreprises sur demande : contact[at]mokatech.net.
Inscrivez-vous vite !

Java Quiz #31

Faites en sorte que chaque instanciation de la classe SubClass affiche "foo" "bar" dans la console.
Seul le contenu de la classe SubClass peut être modifié.

  1. public class BaseClass {
  2. public BaseClass() {
  3. this(null);
  4. }
  5. public BaseClass(Object... params) {
  6. System.out.println("bar");
  7. }
  8. }
  1. public class SubClass extends BaseClass {
  2. }

Réponse :
Plusieurs réponses valides ont été données dans les commentaires, félicitations !

Il fallait trouver une astuce pour appeler du code avant que le constructeur de la classe mère ne soit appelé.
Le seul moyen d'y parvenir est d'exécuter du code pendant l'appel de super(), par exemple en lui fournissant en paramètre le résultat de l'appel à une méthode.


Commentaires

1. Le mardi 12 janvier 2010, 00:13 par Laure Némée

public class SubClass extends BaseClass {

   static {
       System.out.print("foo ");
   }

}

Le bloc statique est exécuté au chargement de la classe, avant l'instantiation de la classe SubClass (qui exécute d'abord le code d'instantiation de BaseClass).

2. Le mardi 12 janvier 2010, 01:14 par Olivier Croisier

Je tire mon chapeau à Laure qui a répondu ici au premier énoncé (qui était incomplet), mais qui m'a également fait parvenir par mail la réponse correcte à l'énoncé corrigé.
Et vous, trouverez-vous ?

3. Le mardi 12 janvier 2010, 08:21 par Benoît

Je dois être un peu bête, mais je comprend pas pourquoi la réponse de Laure n'est pas encore bon avec l'énoncé tel qu'il est maintenant (je ne l'ai pas vu avant modification).

4. Le mardi 12 janvier 2010, 08:57 par desperado
public class SubClass extends BaseClass {
  public static void main(String[] args) {
    for(int i =0; i< 10; i++)
      new SubClass();
  }
  public SubClass() {
    super(System.out.append("foo "));
  }
}

Si on appelle le constructeur parent, il doit etre le premier appel obligatoirement. Heureusement, le constructeur parent accepte n'importe quel parametre en entrée y compris le résultat d'une fonction ! On utilise la méthode PrintStream.append pour insérer du texte dans le buffer, le println du constructeur parent fera le reste.

5. Le mardi 12 janvier 2010, 09:00 par desperado

@Benoit : Olivier a ajouté le fait que le texte foo bar doit etre affiché a CHAQUE instanciation de la classe Subclass. Un code static n'est appelé qu'au chargement de la classe, donc juste une fois.

6. Le mardi 12 janvier 2010, 09:38 par Olivier Croisier

@desperado Bien joué :)

7. Le mardi 12 janvier 2010, 10:28 par Piwaï

Rien à redire, desperado a tiré plus vite que son ombre :-)

Tiens, et si modifie l'énoncé de la manière suivante : afficher "foo bar doh" au lieu de "foo bar", en utilisant la classe SubClass telle que définie par desperado, et sans modifier le constructeur ni ajouter de constructeur ?

Bon c'est facile, mais c'est histoire d'en remettre une couche :-) .

8. Le mercredi 13 janvier 2010, 19:59 par Benoît

Un poil plus tordu :

public class SubClass extends BaseClass {

 public SubClass() {
   super(new Object() { 
     {
       System.out.print("foo ");
     }
   });
 }

 public static void main(String[] args) {
   new SubClass();
 }

}

J'ai essayé des choses en mettant des objects anonymes en attributs, avec des blocs d'initialisation à l'intérieur, mais ça ne marche pas.

9. Le mercredi 13 janvier 2010, 23:10 par Olivier Croisier

@Benoît Ah oui bien joué aussi, c'est une solution originale.

Ajouter un commentaire

Le code HTML est affiché comme du texte et les adresses web sont automatiquement transformées.