Programmation Orientée Objet – Java Les types paramétrés Types

Programmation Orientée Objet – Java
Bertrand Estellon
Département Informatique et Interactions
Aix-Marseille Université
21 septembre 2016
Bertrand Estellon (DII – AMU) Programmation Orientée Objet – Java 21 septembre 2016 1 / 171
Java Types génériques et paramétrés
Les types paramétrés
Supposons que nous ayons la classe suivante :
public class Stack {
private Object[] stack =new Object[100];
private int size = 0;
public void push(Object object) {
stack[size] = object;size++;
}
public Object pop() {
size--; Object object =stack[size];
stack[size]=null;// Pour le Garbage Collector.
return object;
}
}
Bertrand Estellon (DII – AMU) Programmation Orientée Objet – Java 21 septembre 2016 117 / 171
Java Types génériques et paramétrés
Types paramétrés
Nous rencontrons le problème suivant :
Stack stack =new Stack();
String string ="truc";
stack.push(string);
string = (String)stack.pop(); // Transtypage obligatoire !
Nous avons également le problème suivant :
Stack stack =new Stack();
Integer integer =new Integer(2);
stack.push(integer);
String string = (String)stack.pop(); // Erreur à l'exécution
Bertrand Estellon (DII – AMU) Programmation Orientée Objet – Java 21 septembre 2016 118 / 171
Java Types génériques et paramétrés
Types paramétrés
Par conséquent, on souhaiterait pouvoir préciser le type des éléments :
Stack<String>stack =new Stack<String>();
String string ="truc";
stack.push(string); // Le paramètre doit être un String.
string =stack.pop(); // La méthode retourne un String.
Java nous permet de dénir une classe Stack qui prend en paramètre un
type. Ce type paramétré va pouvoir être utilisé dans les signatures des
méthodes et lors de la dénition des champs de la classe.
Lors de la compilation, Java va utiliser le type paramétré pour eectuer :
des vérications de type ;
des transtypages automatiques ;
des opérations d’emballage ou de déballage de valeurs.
Bertrand Estellon (DII – AMU) Programmation Orientée Objet – Java 21 septembre 2016 119 / 171
Java Types génériques et paramétrés
Classes paramétrées
La nouvelle version de la classe Stack :
public class Stack<T> {
private Object[] stack =new Object[100];
private int size = 0;
public void push(T t) { stack[size] = t;size++; }
public Tpop() {
size--;
T t = (T)stack[size];
stack[size] = null;
return t;
}
}
Bertrand Estellon (DII – AMU) Programmation Orientée Objet – Java 21 septembre 2016 120 / 171
Java Types génériques et paramétrés
Emballage et déballage
Les types simples ne sont pas des classes :
Stack<int>stack =new Stack<int>(); // interdit !
Dans ce cas, on doit utiliser la classe d’emballage Integer :
Stack<Integer>stack =new Stack<Integer>();
int intValue = 2;
Integer integer =new Integer(intValue);
// ,emballage du int dans un Integer.
stack.push(integer);
integer =stack.pop();
intValue =integer.intValue();
// ,déballage du int présent dans le Integer.
Bertrand Estellon (DII – AMU) Programmation Orientée Objet – Java 21 septembre 2016 121 / 171
Java Types génériques et paramétrés
Rappel : Les types primitifs
byte entier 8 bits -128 à 127 0
short entier 16 bits -32768 à 32767 0
int entier 32 bits 231 à231 10
long entier 64 bits 263 à263 10
oat otant 32 bits 0.0
double otant 64 bits 0.0
char caractère 16 bits caractères Unicode \u0000
boolean boolean 1 bit false ou true false
Bertrand Estellon (DII – AMU) Programmation Orientée Objet – Java 21 septembre 2016 122 / 171
Java Types génériques et paramétrés
Classes d’emballage
Les classes d’emballage :
Byte public Byte(byte b)
Short public Short(short s)
Integer public Integer(int i)
Long public Long(long l)
Float public Float(float f)
Double public Double(double d)
Boolean public Boolean(boolean b)
Character public Character(char c)
Bertrand Estellon (DII – AMU) Programmation Orientée Objet – Java 21 septembre 2016 123 / 171
Java Types génériques et paramétrés
Emballage et déballage automatique
Depuis Java 5, il existe l’emballage et le déballage automatique :
Stack<Integer>stack =new Stack<Integer>();
int intValue = 2;
stack.push(intValue);
// ,emballage automatique du int dans un Integer.
intValue =stack.pop();
// ,déballage automatique du int.
Attention : il est important de noter que des allocations sont eectuées
lors des emballages sans que des new soient présents dans le code.
Bertrand Estellon (DII – AMU) Programmation Orientée Objet – Java 21 septembre 2016 124 / 171
Java Types génériques et paramétrés
Structures de données Java
Des interfaces :
Collection<V> : Groupe d’éléments
List<V> : Liste d’éléments ordonnés et accessibles via leur indice
Set<V> : Ensemble d’éléments uniques
Queue<V> : Une le d’éléments (FIFO)
Deque<V> : Une le à deux bouts (FIFO-LIFO)
Map<K,V> : Ensemble de couples clé-valeur.
Il est préférable d’utiliser les interfaces pour typer les variables :
List<Integer>list =new ArrayList<Integer>();
/* code qui utilise list. */
car on peut changer la structure de données facilement :
List<Integer>list =new LinkedList<Integer>();
/* code qui utilise list et qui n'a pas à être modifié. */
Bertrand Estellon (DII – AMU) Programmation Orientée Objet – Java 21 septembre 2016 125 / 171
Java Types génériques et paramétrés
Structures de données Java
Implémentations de List<V> :
ArrayList<V> : Tableau dont la taille varie dynamiquement.
LinkedList<V> : Liste chaînée.
Stack<V> : Pile (mais une implémentation de Deque est préférable).
Implémentations de Map<K,V> :
HashMap : Table de hachage.
LinkedHashMap : Table de hachage + listes chainées.
TreeMap : Arbre rouge-noir (éléments comparables).
Bertrand Estellon (DII – AMU) Programmation Orientée Objet – Java 21 septembre 2016 126 / 171
Java Types génériques et paramétrés
Structures de données Java
Implémentations de Set<V> :
HashSet<V> : Avec une HashMap.
LinkedHashSet<V> : Avec une LinkedHashMap.
TreeSet<V> : Avec une TreeMap.
Implémentations de Deque<V> :
ArrayDeque<V> : Avec un tableau dynamique.
LinkedList<V> : Avec une liste chaînée.
Bertrand Estellon (DII – AMU) Programmation Orientée Objet – Java 21 septembre 2016 127 / 171
1 / 3 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !