Arnaud Labourel
8 ou 10 octobre 2018
Une méthode peut utiliser les propriétés et méthodes d’un autre instance/classe :
Afin d’implémenter ses services, une instance peut créer des instances et conserver leur références dans ses attributs.
Une instance peut simplement posséder des références vers des instances :
public class Circle {
private Point center, point;
public Circle(Point Center, Point point){
this.center = center;
this.point = point;
}
public double getCenter(){ return center; }
public double getRadius(){
double dx = center.x - point.x;
double dy = center.y - point.y;
return Math.hypot(dx, dy);
}
}
Délégation du calcul de la distance à l’instance center
de la classe Point
:
Il est possible de créer des structures récursives (les attributs de la classe contiennent des références vers une instance de la classe).
Node a = new Node("a");
Node b = new Node("b");
Node c = new Node("c");
Node d = new Node("d");
Node[] arrayAB = new Node[]{a,b};
Node ab = new Node("ab", arrayAB);
Node[] arrayCD = new Node[]{c,d};
Node cd = new Node(arrayCD, "cd");
Node cd = new Node("cd", arrayCD);
Node abcd = Node cd = new Node("abcd", arrayABCD);
Il est ensuite possible d’implémenter des méthodes de façon récursive :
\(~\)
Un code non testé n’a aucune valeur.
Tout code doit être testé
Tester une unité de code : classe, méthodes, …
JUnit
assertTrue(boolean condition)
: vérifie que condition
est vraie.assertFalse(boolean condition)
: vérifie que condition
est faux.assertEquals(expected, actual)
: vérifie que expected
est à actual
equals
pour les objets et ==
pour les types primitifs.assertEquals(double expected, double actual, double delta)
: vérifie que \(|expected - actual|\leq delta\)assertNull(Object object)
: vérifie que la référence est null
assertNotNull(Object object)
: vérifie que la référence n’est pas null
assertSame(Object expected, Object actual)
: vérifie que les deux objets sont les mêmes (même référence).assertArrayEquals(Object[] expected, Object[] actual)
: vérifie si les deux tableaux contiennent les même éléments dans le même ordre.
fail()
: échoue toujours
Pour toutes les méthodes assert
, il est possible de mettre un message
en premier paramètre qui permet d’identifier l’assertion.
git clone adresse_projet
\(\Rightarrow\) Clone un projet en local depuis un serveur
git add nom_de_fichier
\(\Rightarrow\) Ajoute un fichier à la prochaine mise à jour.
git commit -m"commentaire"
\(\Rightarrow\) Fait une mise à jour en local
git push
\(\Rightarrow\) Pousse les mises à jour locales sur le serveur
git pull
\(\Rightarrow\) Récupère les mises à jour du serveur en local
Stack
d’Object
Supposons que nous ayons la classe suivante :
Stack
d’Object
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 :
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 string = stack.pop(); // retourne un String.
Java nous permet de définir 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éfinition des champs de la classe.
Lors de la compilation, Java va utiliser le type paramétré pour effectuer :
La nouvelle version de la classe Stack :
Les types primitifs ne sont pas des classes :
Dans le cas d’un int
, on doit utiliser la classe d’emballage (wrapper class) Integer :
Interdit : Stack<int> stack = new Stack<int>();
Autorisé :
type | classe d’emballage | taille | valeurs possibles |
---|---|---|---|
byte | Byte | 8 bits | -128 à 127 |
short | Short | 16 bits | -32768 à 32767 |
int | Integer | 32 bits | \(-2^{31}\) à \(2^{31} - 1\) |
long | Long | 64 bits | \(-2^{63}\) à \(2^{63} - 1\) |
float | Float | 32 bits | |
double | Double | 64 bits | |
char | Character | 16 bits | caractère unicode |
boolean | Boolean | non définie | false ou true |
La classe Number
sert de base pour toutes les classes d’emballage.
Elle contient les méthodes suivantes :
public int intValue()
public long longValue()
public float floatValue()
public double doubleValue()
public byte byteValue()
public short shortValue()
Les classes d’emballage étendent Number
:
Byte
→ public static Byte valueOf(byte b)
Short
→ public static Short valueOf(short s)
Integer
→ public static Integer valueOf(int i)
Long
→ public static Long valueOf(long l)
Byte
→ public static Byte valueOf(byte b)
Ils existent des constructeurs mais ils sont dépréciés (et donc pas à utiliser).
Les classes d’emballage ne contiennent pas que des méthodes liées aux instances :
public static Byte valueOf(byte b)
public static char charValue()
public static boolean isLowerCase(char ch)
public static boolean isUpperCase(char ch)
public static boolean isDigit(char ch)
public static boolean isLetter(char ch)
public static boolean isLetterOrDigit(char ch)
public static char toLowerCase(char ch)
public static char toUpperCase(char ch)
public static char toTitleCase(char ch)
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.
int otherIntValue = stack.pop();
// → déballage automatique du int.
Il est important de noter que des allocations sont effectuées lors des emballages sans que des new
soient présents dans le code.
On considère une liste chaînée de String
Nous la transformons en classe paramétrée de la façon suivante :