Programmation avancée et répartie en Java : rappels sur les mots-clés de Java Frédéric Gava L.A.C.L Laboratoire d’Algorithmique, Complexité et Logique Cours de M1 MIAGE Plan 1 Flot de contrôle 2 Gestion des classes Plan 1 Flot de contrôle 2 Gestion des classes Flot de contrôle Gestion des classes Déroulement du cours 1 Flot de contrôle 2 Gestion des classes Programmation avancée et répartie en Java 3 / 22 Flot de contrôle Gestion des classes Assert Rôle Permet de s’assurer d’une propriété avant de continuer l’exécution. assert condition [: objet] ; Un AssertionError est lancé si la condition n’est pas vérifiée. Les assertions sont ignoré par défaut (il faut utiliser l’option -ea ou -enableassertions pour les activer). Dans la condition, ne pas mettre un calcul qui modifie vos données ! Exemple private double divise(int a, int b) { assert b != 0 : ”Impossible de diviser par zéro”; ... On vérifie souvent les paramètres d’une méthode avec des assert pour être sûr qu’ils sont tels qu’on les pense. Programmation avancée et répartie en Java 4 / 22 Flot de contrôle Gestion des classes Break et Continue (1) Rôle break : une instruction permettant de sortir d’une instruction de contrôle, d’un opérateur d’itération ou d’un bloc try. continue : permet de sauter une itération d’une boucle. C’est à dire qu’on passe directement à l’itération suivante sans effectuer le reste des opérations. Exemple (1) for(int i = 0; i < 1555; i++){ if(condition) break; //On sort de la boucle ... } Programmation avancée et répartie en Java 5 / 22 Flot de contrôle Gestion des classes Break et Continue (2) Exemple (2) Boucle1: while(true){ System.out.println(”Boucle 1”); Boucle2: for(int ind=0; ind < 10; ind++) { System.out.println(”Boucle 2”); Boucle3: while(true){ System.out.println(”Boucle 3”); break Boucle2; } } break; } Exemple (3) while(true) { ... if(condition1) break; // quitte la boucle if (condition2) continue; // retourne au début de la boucle ... } Programmation avancée et répartie en Java 6 / 22 Flot de contrôle Gestion des classes Switch, case et default Rôle Eviter trop de if else dans le cas où il y a plusieurs cas possibles. Le code de default est exécuté si aucun case n’est possible. Utilisation de break pour couper le switch, sinon celui-ci teste aussi les autres case (au cas où). Exemple switch(id) { case 1 : System.out.println(”Je suis premier”); break; case 2 : System.out.println(”Je suis deuxième”); break; case 3 : System.out.println(”Je suis troisième”); break; default : System.out.println(”Je ne sais pas où je suis”); } Fonctionne aussi avec les String depuis Java 7. Programmation avancée et répartie en Java 7 / 22 Flot de contrôle Gestion des classes Finally Rôle Clause suivie d’un bloc d’instructions. Cette clause suit elle-même un bloc try, ou un bloc try catch. Quelque soit la manière dont on sort du try, les instructions contenues dans le finally sont toujours exécutées. Exemple try { ... //Instructions quelconques } finally { ... //Opérations effectuées après les instructions du try } Programmation avancée et répartie en Java 8 / 22 Flot de contrôle Gestion des classes Throw et Throws Rôle throw est pour lancer une exception. throws est pour indiquer que la méthode peut faire remonter une exception. Exemple if(erreur) throw new Exception(”Une erreur est arrivée”); public void read throws IOException { //Code pouvant lancer une IOException } Rappel : Exception et IOException doivent obligatoirement descendre de Throwable. Programmation avancée et répartie en Java 9 / 22 Flot de contrôle Gestion des classes Utilisation de this dans une classe interne Rôle Dans le cas d’une classe interne (non static), le mot clé this permet de récupérer l’instance de la classe englobante. Exemple public class Englobante { private Object attribut; public final class Interne { private Object attribut; private switch() { Englobante.this.attribut = this.attribut; } ... Englobante.this fait donc référence à l’instance de la classe englobante et this fait référence à la classe interne. Programmation avancée et répartie en Java 10 / 22 Flot de contrôle Gestion des classes Synchronised Plus de détails la semaine prochaine ! Rôle Utilisé dans la programmation multithread dans la déclaration d’une méthode ou d’un bloc d’instructions pour indiquer que seul un thread peut accéder en même temps à ce bloc ou à cette méthode 4 manières d’utilisation (1) public void synchronized methode(){ print(”2 threads ne peuvent pas appeler cette méthode ‘en même temps’”); ... (2) public void methode(){ synchronized(this){ print(”2 threads ne peuvent pas exécuter ce code ‘en même temps’”); ... (3) synchronized(monObjet) {... // code} (4) public static void methode() {synchronized(MaClass.class) {... // code} ... } Programmation avancée et répartie en Java 11 / 22 Flot de contrôle Gestion des classes Volatile Plus de détails prochainement ! Rôle Utilisation sur des variables modifiables de manière asynchrone (plusieurs threads y ont accès “simultanément”). Le fait d’employer volatile oblige la JVM à rafraı̂chir son contenu à chaque utilisation. Ainsi, on est sûr qu’on n’accède pas à la valeur mise en cache mais bien à la valeur correcte. Déclaration public volatile Integer = 5; Programmation avancée et répartie en Java 12 / 22 Flot de contrôle Gestion des classes Déroulement du cours 1 Flot de contrôle 2 Gestion des classes Programmation avancée et répartie en Java 13 / 22 Flot de contrôle Gestion des classes Import static Rôle Importer que les codes statiques. Utilisation import com.test.Tester; import static java.lang.∗; Permet d’importer dans notre code, une classe stactic ou une variable static d’une classe, ceci à des fins d’allégement de code. Programmation avancée et répartie en Java 14 / 22 Flot de contrôle Gestion des classes Native Plus de détails prochainement ! Rôle Ce mot-clé est utilisé dans la déclaration d’une méthode pour indiquer que cette méthode n’est pas codée en Java, mais dans un langage natif dans un fichier à part (du C généralement). Une telle méthode n’a donc pas de corps puisque le code ne se trouve pas dans la classe Java. Déclaration public native void ouvrirLecteurCD(); Beaucoup utilisé dans les bibliothèques standards pour effectuer des appels systèmes en code C (IO, matériel, etc.) Programmation avancée et répartie en Java 15 / 22 Flot de contrôle Gestion des classes Strictfp Rôle Utilisable sur la déclaration de classes, d’interfaces ou de méthodes. Il oblige la JVM à effectuer les calculs selon les spécifications du langage : garantie un même résulat quelle que soit la machine virtuelle utilisée. Java effectue les calculs en garantissant une priorité de la gauche vers la droite. Mais pas forcement les implémentations des JVM... Exemple public strictfp class FPDemo { public static void main(String[] args) { double d = 8e+307; System.out.println(4 ∗ d / 2); ===> si droite gauche alors, (d/2)∗4 System.out.println(2 ∗ d); (4∗d) produit un dépassement de capacité, donc un résultat infini. En revanche, 2∗d produit bien un résultat correct. Programmation avancée et répartie en Java 16 / 22 Flot de contrôle Gestion des classes Transient Rôle Permet de ne pas sauvegarder une variable lors de la sérialisation de la classe. Ainsi la variable ne va pas apparaı̂tre dans le fichier. Applications alors qu’une donnée sensible ne doit en aucun cas apparaı̂tre dans un fichier (p. ex. un mot de passe). Cela permet aussi de “remettre à zéro” certaines valeurs (p. ex., dans un jeu, ne pas sauvegarder le temps de jeu depuis le début de la partie). Utilisation class Writeable implements java.io.Serializable { ... public transient int var1 = 2; Si nous sérialisons une instance de cette classe, “var1” ne sera pas sauvegardée. Lors de la désérialisation, elle prendra la valeur 0 malgré la présence de la valeur par défaut 2. L’attribution d’une valeur par défaut se fait lors de l’instanciation de l’objet. Programmation avancée et répartie en Java 17 / 22 Flot de contrôle Gestion des classes Final, Rappel des rôles (1) Devant une méthode Celle-ci ne pourra plus être redéfinie dans une classe fille. Ce qui entraı̂ne une certaine optimisation dans les appels à cette méthode. Devant une classe On ne peut pas créer de classe dérivée de celle-ci. Par exemple il est impossible de dériver une classe à partir de la classe String de la bibliothèque de base. La solution consisterait à “encapsuler” String dans une classe de notre conception. Devant un paramètre d’une méthode Empêche l’attribution d’une nouvelle valeur au paramètre : public void methode(final List<Object> liste, final int entier){ entrier = 0; // interdit liste = new ArrayList<Object>(); // interdit Programmation avancée et répartie en Java 18 / 22 Flot de contrôle Gestion des classes Final, Rappel des rôles (2) Devant une variable membre ou une variable locale La variable ne peut plus être modifiée après son initialisation et doit obligatoirement être initialisée une fois (et une seule fois). Si la classe possède plusieurs constructeurs, la variable doit être correctement initialisée quel que soit le constructeur utilisé (sinon le compilateur provoquera une erreur). Pour une variable membre static, elle doit être initialisée telle quelle : private static final int x = 5; Immutable ≡ final Un objet est immutable s’il n’est jamais modifiée après sa construction. Un objet immutable est toujours thread-safe. Cohérence du mot-clés : nous verrons plus tard qu’un objet spécial est toujours associé à une définition de classe. Donc, à une classe final (héritage interdit) est associée un objet immutable. Programmation avancée et répartie en Java 19 / 22 Flot de contrôle Gestion des classes Enum, énumérations (1) Rôle Permettre d’avoir différentes valeurs pour des variables sans utiliser une simulation avec des String ou des int. Exemple public enum Langage {JAVA, C, CPlus, PHP; } les énumérations héritent de la classe java.lang.Enum. Utilisation for(Langage lang : Langage.values()){ if(Langage.JAVA.equals(lang)) System.out.println(”J’aime le : ” + lang); // ===> Affiche JAVA ... Programmation avancée et répartie en Java 20 / 22 Flot de contrôle Gestion des classes Enum, énumérations (2) Constructeur public enum Langage { //Objets directement construits JAVA (”Langage JAVA”), C (”Langage C”), CPlus (”Langage C++”), PHP (”Langage PHP”); private String name = ””; //Constructeur Langage(String name){this.name = name;} public String toString(){return name;} ... Remarque : pas de déclaration de portée, pour une raison simple ; il est toujours considéré comme private afin de préserver les valeurs définies dans l’enum. Programmation avancée et répartie en Java 21 / 22 Au travail !