:: Enseignements :: Master :: M1 :: 2012-2013 :: Java Avancé ::
[LOGO]

Examen de Java Avancé sur table


Exercice 1 - Questions de cours (5)

Réponder aux questions suivantes en deux ou trois phrases, pas plus.

  1. Qu'est ce que cela veut dire qu'une classe est non-mutable ?
    Pourquoi est ce intéressant ?
  2. Expliquer pourquoi le code ci-dessous ne compile pas.
            class A {
              class B {
                private void foo() { }
              }
              
              public static void main(String[] args) {
                new B().foo();
              }
            }
          

    Indiquer ce qu'il faut faire pour que cela compile (il y a deux solutions, une seule me suffira).
  3. Qu'est ce que l'erasure ?
  4. A quoi sert la notation '?' (wildcard) dans un type en Java ?
    La question est vraiment "A quoi cela sert ?", et non pas comment on l'utilise.
  5. Qu'est ce que la reflection en Java ?

Exercice 2 - A long summer or a LongSumer (8)

On cherche à implanter une classe dont le but est de maintenir la somme d'un tableau d'entiers long pour que l'accès à la valeur de la somme (de même que la valeur de chaque élément du tableau) soit toujours en temps constant.
Le nombre d'élements du tableau d'entier long ne pourra pas être changé après construction.

  1. Ecrire le code de la classe LongSumer avec
    • Un constructeur prenant en paramètre la taille du tableau d'entier long et qui initialise les cases du tableau avec des 0.
      Eviter le code inutile, SVP.
    • Un méthode get qui prend un index, renvoie la valeur de l'entier à la case correspondant à l'index.
    • Une méthode set qui prend un index et un entier long et qui change la valeur de la case à l'index par l'entier long.
    • Une méthode sum qui renvoie la somme des élements du tableau (en temps constant donc !).
    On souhaite que la représentation en mémoire de la classe LongSumer soit compacte, donc pas d'ArrayList ou autre LinkedList pour stocker l'état interne de la classe. De plus, on vous demande d'utiliser le moins de champs possible.
  2. Justifier les modificateurs que vous avez utilisé pour chaque champ de la classe LongSumer.
  3. On souhaite exporter une vue du tableau sous-jacent sous forme d'un objet implantant l'interface java.util.List. Pour cela, on vous demande d'écrire une méthode asList renvoyant une vue sous forme de liste du tableau d'entiers long. La liste agira comme une vue, donc toutes modifications d'une case à travers la liste devra modifier le tableau de la classe LongSumer et toutes modifications d'une case du tableau par la méthode set de la classe LongSumer devra être visible sur la liste. Comme le tableau possède une taille fixe, la liste ne devra pas permettre les opérations tel que add ou remove, la seule opération de modification possible sur la liste est List.set().
    Fournir le code de la méthode asList (et tout ce qui va avec).
  4. A quoi sert l'interface java.util.RandomAccess ?
    Comment faut il l'utiliser ici ?

Exercice 3 - Un ThreadSafeLongSumer (8)

On cherche maintenant à créer une version thread-safe de la classe LongSumer, la classe ThreadSafeLongSumer. On vous demande d'implanter seulement les opérations get, set et sum (donc pas de méthode asList).
On vous demande d'écrire la classe ThreadSafeLongSumer en utilisant un verrou read/write lock ou si vous ne savez pas le faire, en utilisant la construction "synchronized".

  1. Expliquer pourquoi implanter la classe ThreadSafeLongSumer avec des opérations atomiques n'est pas possible.
  2. Dans le cas où l'on écrirait la classe ThreadSafeLongSumer avec la construction "synchronized", peut-on utiliser le tableau d'entiers long comme moniteur ? Si oui, pourquoi. Si non, pourquoi ?
  3. Pourquoi est il plus efficace d'utiliser un read/write lock plutôt que la construction "synchronized" dans notre cas ?
  4. Ecrire la classe LongSumer avec un read/write lock ou au pire un block synchronized ayant
    • Un constructeur prenant en paramètre la taille du tableau d'entier long.
    • Un méthode get qui prend un index, renvoie la valeur de l'entier à la case correspondant à l'index.
    • Une méthode set qui prend un index et un entier long et qui change la valeur de la case à l'index par l'entier long.
    • Une méthode sum qui renvoie la somme des élements du tableau (toujours en temps constant).
  5. On souhaite écire une méthode threshold qui prend en paramètre une valeur (entier long) et un block de code (un Runnable) et exécute le block de code si la somme est supérieur à la valeur seuil (threshold en anglais). Si la somme est inférieur à la valeur de seuil, la méthode threshold bloque la thread courante jusqu'à ce que la valeur de la somme atteigne la valeur de seuil. Lorsque la valeur de seuil est atteinte ou dépassée, le block de code est exécuté et pendant l'exécution de celui-ci, aucune valeur du tableau ne peut être modifiée.
    Indiquer le code de la méthode threshold et si nécessaire les modifications qu'il faut apporter aux parties de la classe.
  6. Comment gérer l'InterruptedException dans la méthode threshold ?
  7. On souhaite pouvoir faire un for-each (le for(:) de Java) sur un object de type ThreadSafeLongSumer pour renvoyer les valeurs du tableau d'entiers long une par une. Indiquer le code à ajouter dans la classe ThreadSafeLongSumer sachant que lors du parcours si l'on modifie une des cases du tableau, la boucle for-each continuera à utiliser les anciennes valeurs (cela correspond à la sémantique snapshot si vous préférez).