1 Objectifs de ce cours (I21) Cours JAVA (I21) -Licence 1 Semestre 2 / Y.Laborde Maintenant !
2 Cours JAVA (I21) -Licence 1 Semestre 2 / Y.Laborde Les énumérations en Java Exemples dénumérations : Les jours de la semaine public enum Jour {LUNDI, MARDI, MERCREDI, JEUDI, VENDREDI, SAMEDI, DIMANCHE } Les saisons public enum Saison {PRINTEMPS, ETE, AUTOMNE, HIVER } Les couleurs des cartes public enum COULEUR {PIQUE, COEUR, CARREAU, TREFLE } à partir de là, on peut définir des variables qui relèvent dune énumération : Jour j = LUNDI; Attention: il ny a pas de guillemets COULEUR couleur = PIQUE;car ce ne sont pas des String mais des noms (littéraux) Les énumérations permettent de définir des types qui contiennent un ensemble figé de constantes simplement désignées par des noms littéraux Par convention, on met toujours les noms des constantes dénumération en MAJUSCULES. On peut également choisir de mettre les noms des types dénumération en MAJUSCULES.
3 Cours JAVA (I21) -Licence 1 Semestre 2 / Y.Laborde Les énumérations en Java on peut utiliser ces variables dans des expressions Java : - pour de nouvelles affectations : j = Jour. MERCREDI) // la variable j contient maintenant le littéral MERCREDI - pour des comparaisons simples : if ( j = = Jour. LUNDI) //...faire quelque chose de particulier à LUNDI... - pour des comparaisons multiples : switch ( couleur ) { case PIQUE : //...faire quelque chose de particulier à PIQUE... puis break; case COEUR : //...faire quelque chose de particulier à COEUR... puis break; case CARREAU : //...faire quelque chose de particulier à CARREAU... puis break; case TREFLE : //...faire quelque chose de particulier à TREFLE... puis break; } ATTENTION: en Java, les valeurs de comparaison des ordres « case » ne doivent pas utiliser la notation pointée (qui réfère au type dénumération) mais doivent être fournies directement comme dans linstruction « switch » ci-dessus. AU CONTRAIRE: dans tous les autres cas, on doit utiliser la notation pointée comme dans linstruction « if » ci-dessus.
4 Cours JAVA (I21) -Licence 1 Semestre 2 / Y.Laborde Les énumérations en Java Exemple 1, définition de lénumération dans UN FICHIER À PART : fichier Carte.java public class Carte { // Variables d'instance private COULEUR couleur; // couleur de la carte private int rang;// rang de la carte (de 0 à 13) // (Joker rang 0, As rang 1, 2 rang 2,..., Roi rang 13) private int force; // force de la carte (par défaut, la force est égale au rang) /** Construit une carte en donnant sa couleur et son rang. La force de la * carte sera égale à son rang. Le rang doit être compris entre 0 et 13. public Carte (COULEUR couleur, int rang) { this.couleur = couleur; this.rang = (rang >= 1 && rang <= 13 ? rang : 0); this.force = this.rang; } fichier COULEUR.java /** Définition des couleurs des cartes (à l'aide de constantes littérales énumérées). */ public enum COULEUR { PIQUE, COEUR, CARREAU, TREFLE }
5 Cours JAVA (I21) -Licence 1 Semestre 2 / Y.Laborde Les énumérations en Java Exemple 2, définition de lénumération dans UN FICHIER DE CLASSE : fichier Carte.java /** Définition des couleurs des cartes (à l'aide de constantes littérales énumérées). */ public enum COULEUR { PIQUE, COEUR, CARREAU, TREFLE } public class Carte { // Variables d'instance private COULEUR couleur;// couleur de la carte private int rang;// rang de la carte (de 0 à 13) // (Joker rang 0, As rang 1, 2 rang 2,..., Roi rang 13) private int force; // force de la carte // (par défaut, la force est égale au rang) /** Construit une carte en donnant sa couleur et son rang. La force de la * carte sera égale à son rang. Le rang doit être compris entre 0 et 13. */ public Carte (COULEUR couleur, int rang) { this.couleur = couleur; this.rang = (rang >= 1 && rang <= 13 ? rang : 0); this.force = this.rang; } NE PAS DECLARER PUBLIC La déclaration dune énumération dans un fichier de classe existant entraîne quelques différences (liées à la notion de package) qui ne seront vues que plus tard.
6 Cours JAVA (I21) -Licence 1 Semestre 2 / Y.Laborde Les classes de types primitifs ( wrappers) Mais, nétant pas des objets : ces données ne disposent daucune méthode ! Les types primitifs des langages O-O (byte, double, float, int, long, short, char, boolean) fournissent des données immédiates (entières, réelles, de caractère ou booléennes) et ne peuvent être fournis en arguments là où un objet est attendu ! Pour palier à cela, tous les types primitifs ont été encapsulés dans des classes. Types primitifs byteshortintlongfloatdoublecharboolean Classes correspondantes (wrapped, litt. emballés) ByteShortIntegerLongFloatDoubleCharacterBoolean Voir
7 Cours JAVA (I21) -Licence 1 Semestre 2 / Y.Laborde Les classes de types primitifs ( wrappers) Chaque classe contient une valeur primitive du type correspondant mais les objets issus des classes wrappées sont immutables. Leurs valeurs sont figées à la construction. Chaque classe fournit plusieurs méthodes : - pour convertir sa valeur (entière, réelle ou booléenne) en String - pour convertir un String en une valeur (entière, réelle ou booléenne) - ainsi que des constantes et dautres méthodes utiles Voir Exemple :// Ici, lobjet instancié ne changera jamais de valeur, il vaudra toujours 12 ! Integer wi = new Integer(12); Exemples : new Integer(12) Integerwi.byteValue() byteInteger.toString(12) String new Integer ("12") Integerwi.intValue() intInteger.toString(12,16) String Integer.valueOf(12) Integerwi.doubleValue() doubleInteger.toHexString(12) String Integer.valueOf("12") Integerwi.floatValue() floatInteger.parseInt("12") int Integer.valueOf( "FF",16) IntegerInteger.parseInt("12",16) int Integer.MAX_VALUE int ( )
8 Cours JAVA (I21) -Licence 1 Semestre 2 / Y.Laborde Les classes de types primitifs ( wrappers) Autoboxing et unboxing Autant que possible, on préfèrera utiliser des types primitifs dans nos codes. Il savèrera donc nécessaire deffectuer des conversions vers des objets wrappés quand cela sera indispensable. Heureusement, le plus souvent, cest le compilateur qui se chargera de tout cela ! Il effectuera tantôt un autoboxing (mise en boîte: int Integer), tantôt un unboxing (Integer int) là où ce sera nécessaire ! Voir Exemple :// Ici, nbCartes est un type primitif à conjuguer avec un objet String System.out.println ("nombre de cartes = " + nbCartes); // Ici, wx et wy sont des types objets initialisés avec des types primitifs Integer wx, wy; wx = 12; wy = 15; // Ici, wx et wy sont des types objets à additionner auparavant comme des int System.out.println ( wx+wy ); Voir
9 Cours JAVA (I21) -Licence 1 Semestre 2 / Y.Laborde Les classes de types primitifs ( wrappers) Application aux classes ensemblistes Si lon désire former un ensemble dentiers à laide dune classe ArrayList, il nest dautre solution que de spécialiser à laide dune classe wrappées, soit ArrayList. Comme précédemment, cest le compilateur qui se chargera de toutes les conversions ! Exemple :// On commence par instancier une liste dentiers ArrayList listeEntiers = new ArrayList (); // Ici, on insère des entiers directement à laide de types primitifs int ! listeEntiers.add(12);... // Ici, on veut utiliser des types objets comme des int ! if ( listeEntiers.get(0) > listeEntiers.get(1) )... if ( listeEntiers.get(0) + 1 > listeEntiers.get(1) )... // Ici, on veut directement itérer sur la base de types primitifs int ! for ( int i : listeEntiers ) { if ( i != 0 )... } Évite : listeEntiers.add(Integer.valueOf(12)) Évite :listeEntiers.get(0).intValue() listeEntiers.get(1).intValue() Évite :listeEntiers.get(0).intValue() listeEntiers.get(1).intValue() Évite :for ( Integer wi : listeEntiers ) { if ( wi. intValue() != 0 )... } Évite :for ( Integer wi : listeEntiers ) { if ( wi. intValue() != 0 )... }
10 Cours JAVA (I21) -Licence 1 Semestre 2 / Y.Laborde Première notion dinterface Java Les INTERFACES sont des sortes de CONTRATS que des CLASSES sengagent à respecter Par convention, on commence toujours les noms des interfaces par une MAJUSCULE. Une classe qui sengage à respecter une interface DOIT DONNER une IMPLEMENTATION de TOUTES les méthodes définies dans linterface. Exemple :// INTERFACE servant à définir un CONTRAT de nommage : public interface Nommable { public String getName ( ); public void setName (String name); } Une interface ne fait que définir des signatures de méthodes. La classe Personne respecte linterface Nommable
11 Cours JAVA (I21) -Licence 1 Semestre 2 / Y.Laborde Première notion dinterface Java Dès lors, la classe Personne possède la qualité Nommable et il deviendra possible de ne sintéresser quà cette qualité Si lon dispose de plusieurs classes implémentant une même interface, il peut arriver quune autre classe procède à des traitements communs sur des objets relevant de cette qualité dinterface Exemple :// INTERFACE utilisée pour restreindre la vision dune classe : Personne p = new Personne ("Paul"); p.setNom ("Pierre"); Nommable n = new Personne ("Martin"); n.setNom ("James"); Un objet peut nêtre vue quau travers de sa qualité dinterface. Exemple : // CLASSE utilisant la qualité dinterface Nommable dans lune de ses méthodes : public class CCC { public void sanctifier ( Nommable nble ) { nble.setName ( "Saint " + nble.getName() ); System.out.println ( "Sanctification : " + nble.getName() ); } Csq Un objet peut être passé en paramètre par le biais de sa qualité dinterface quelque soit sa « classe vraie ».
12 Cours JAVA (I21) -Licence 1 Semestre 2 / Y.Laborde Acta est fabula