Java Quiz #37

Voici un nouveau quiz, pour bien finir le mois de mai avant d'entamer ce beau mois de juin.

La classe ColoredPoint ci-dessous pose un problème assez subtil. Lequel ?

  1. public class Point {
  2. private int x;
  3. private int y;
  4.  
  5. public Point(int x, int y) {
  6. this.x = x;
  7. this.y = y;
  8. }
  9.  
  10. public boolean equals(Object o) {
  11. if (this == o) { return true; }
  12. if (!(o instanceof Point)) { return false; }
  13.  
  14. final Point point = (Point) o;
  15. return (x == point.x && y == point.y);
  16. }
  17.  
  18. public int hashCode() {
  19. int result = x;
  20. result = 31 * result + y;
  21. return result;
  22. }
  23. }
  24.  
  25. public class ColoredPoint extends Point {
  26. private Color color;
  27.  
  28. public ColoredPoint(int x, int y, Color color) {
  29. super(x, y);
  30. this.color = color;
  31. }
  32.  
  33. public boolean equals(Object o) {
  34. if (this == o) { return true; }
  35. if (!(o instanceof ColoredPoint && super.equals(o))) {
  36. return false;
  37. }
  38.  
  39. final ColoredPoint point = (ColoredPoint) o;
  40. return (color == null ? (point.color == null) : color.equals(point.color));
  41. }
  42.  
  43. public int hashCode() {
  44. int result = super.hashCode();
  45. result = 31 * result + (color != null ? color.hashCode() : 0);
  46. return result;
  47. }
  48. }
Lire la suite...

Java Quiz #36

Pour créer des instances de classes dont on ne connait que le nom, rien de plus facile : il suffit de récupérer l'instance de Class<?> puis d'appeler newInstance() dessus, et puis de traiter les nombreuses exceptions susceptibles d'être levées.

C'est ce que fait la méthode statique newInstance ci-dessous :

  1. public class TestNewInstance {
  2. public static void main(String[] args) {
  3. final Object o = newInstance(args[0]);
  4. System.out.println(String.valueOf(o));
  5. }
  6.  
  7. private static Object newInstance(String className) {
  8. try {
  9. Class<?> clazz = Class.forName(className);
  10.  
  11. return clazz.newInstance();
  12. } catch (ClassNotFoundException e) {
  13. System.out.println("-- Class Not Found --");
  14. } catch (IllegalAccessException e) {
  15. System.out.println("-- Illegal Access --");
  16. } catch (InstantiationException e) {
  17. System.out.println("-- Cannot Instantiate --");
  18. }
  19. return null;
  20. }
  21. }

Bien sûr, la classe en question doit posséder un constructeur sans argument ; si ce n'est pas le cas, InstantiationException sera levée.

Cependant, malgré toutes ces précautions, ce code pose un gros problème de robustesse, qui ne se révèle que pour quelques classes bien particulières. Pourquoi ? Comment l'éliminer ?

Lire la suite...

Java Quiz #35

Depuis une classe tierce, comment afficher la valeur du champ "message" de la classe ci-dessous ?
Il est naturellement interdit de court-circuiter les règles de visibilité des champs de la classe.

  1. package net.thecodersbreakfast.quiz35
  2. public class OuterClass {
  3.  
  4. private String message = "Hello World";
  5.  
  6. private class InnerClass {
  7. private String getMessage() {
  8. return message;
  9. }
  10. }
  11. }
Lire la suite...

Java Quiz #34

Vous savez qu'au sein de la JVM, une classe est identifiée de manière unique par son nom complet et son classloader.

Cette règle est facile à implémenter sous la forme d'une méthode utilitaire :

  1. public class ClassUtils {
  2. public static boolean isSameClass(Class<?> class1, Class<?> class2) {
  3. if ((class1 == null) || (class2 == null)) { return false; }
  4. return (
  5. class1.getClassLoader().equals(class2.getClassLoader()) &&
  6. class1.getName().equals(class2.getName()) );
  7. }
  8. }

Il ne reste plus qu'à vérifier :

  1. System.out.println( ClassUtils.isSameClass(ClassUtils.class, ClassUtils.class) ); // true
  2. System.out.println( ClassUtils.isSameClass(String.class, ClassUtils.class) ); // false

A moins que... ?

Lire la suite...

Java Quiz #33

La classe ci-dessous part d'une bonne intention, mais où est le problème ?

  1. /**
  2.  * Garantit que les éventuelles exceptions levées par la méthode dangereuse
  3.  * seront loggées.
  4.  * @param <R> Le type de retour de la méthode
  5.  * @param <E> Le type d'exception levé
  6.  */
  7. public abstract class ExceptionLoggingExecutor<R, E extends Throwable> {
  8.  
  9. private final Logger logger = Logger.getLogger(ExceptionLoggingExecutor.class.getName());
  10.  
  11. public final R execute(Object... args) throws E {
  12. try {
  13. return dangerousOperation(args);
  14. } catch (E e) {
  15. logger.error(e);
  16. throw e;
  17. }
  18. }
  19.  
  20. /** La méthode contenant le code dangereux */
  21. protected abstract R dangerousOperation(Object... args) throws E;
  22. }
Lire la suite...

Java Quiz #32

Voici un quiz spécial saint-Valentin ! Comme d'habitude, il s'agit de trouver ce qui cloche avec ce code, sans le coller dans un IDE.

Comme le code est un peu plus long que d'habitude, il est exceptionnellement dans le corps du billet.
Bon quiz !

Lire la suite...

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. }
Lire la suite...

Java Quiz #30

Ah, cela faisait longtemps que je ne vous avais pas proposé de quiz !
En voici un simple qui devrait vous distraire en ce jour pluvieux.

Quel est le problème avec cette méthode très classique ?

  1. /**
  2.  * Affiche le fichier texte passé en paramètre.
  3.  * Les commentaires indiquent les exceptions potentiellement levées
  4.  */
  5. public void displayFile(String fileName) throws IOException {
  6. BufferedReader br = null;
  7. try {
  8. br = new BufferedReader(new FileReader(fileName)); // FileNotFoundException
  9. String line = null;
  10. while ((line=br.readLine()) != null) { // IOException
  11. System.out.println(line);
  12. }
  13. } catch (Exception e) {
  14. e.printStackTrace();
  15. throw e;
  16. } finally {
  17. if (br != null) {
  18. br.close(); // IOException
  19. }
  20. }
  21. }

Note : j'ai corrigé le problème du "close() pas dans un bloc finally" qui distrayait les lecteurs du véritable problème de ce bout de code.

Lire la suite...

Java Quiz #29

Soit un système de gestion dynamique de blogs. Chacun est représenté par une classe qui s'occupe d'assembler ses différentes parties (Header, Content, Footer) placées dans un sous-package propre. Une factory permet d'obtenir dynamiquement le contenu d'un site en fonction de son nom.
Pourquoi ce système ne fonctionne-t-il pas ?

net.thecodersbreakfast.quiz29
+-- sites
    +-- TheCodersBreakfast
    |   +-- Content.java, Footer.java, Header.java
    +-- LeTouilleurExpress
    |   +-- Content.java, Footer.java, Header.java
    +-- TheCodersBreakfast.java
    +-- LeTouilleurExpress.java
    +-- SiteFactory.java
Lire la suite...

Java Quiz #28

Un petit quiz facile pour se rafraîchir en cette semaine bien chaude !
Alors, que fait ce code ?

  1. public class Summer {
  2. public static void main(String[] args) {
  3. List<String> list = new ArrayList<String>(10);
  4. Collections.fill(list, "très ");
  5. list.set(0, "Il fait ");
  6. list.set(9, "chaud !");
  7. System.out.println(list);
  8. }
  9. }
Lire la suite...

- page 2 de 6 -