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 l'interface ou les textes ? Ou savez-vous comment améliorer l'interface utilisateur de StudyLib ? N'hésitez pas à envoyer vos suggestions. C'est très important pour nous!