Une méthode déléguée est une méthode qui ne fait qu’en appeler une autre d’un champ.
Exemple :
public class Voiture {
...
private Moteur moteur;
public void accelere() {
moteur.accelere();
}
}
Dans cet exemple, le calcul de la chaine de caractères représentant l’immatriculation du véhicule est délégué au champ ˋimmatriculation`.
Une copie superficielle (shallow copy) d’un objet est une nouvelle instance dont les champs ont les mêmes valeurs:
Un copie profonde d’un objet effectue une copie profonde des champs de type objet.
Exemple :
public class Point {
private double x;
private double y;
public Point copie() {
return new Point(this.x,this.y);
}
...
}
public class Ligne {
private Point p1;
private Point p2;
private Ligne copieSuperficielle() {
return new Ligne(this.p1,this.p2);
}
public Ligne copieProfonde() {
return new Ligne(this.p1.copie(),this.p2.copie());
}
...
}
public class BiLigne {
private Ligne l1;
private Ligne l2;
public BiLigne copieProfonde() {
return new BiLigne(this.l1.copieProfonde(),
this.l2.copieProfonde());
}
}
final
Dans un premier temps, on déclare toujours un champ final
sauf si l’on est sûr de devoir le modifier
Attention, le mot-clef final
n’assure pas toujours la non mutabilité d’un objet s’il est mis sur un champ de type objet mutable.
En déclarant un champ static
et final
, on obtient une constante. Elle doit être initialisée au moment de sa déclaration (ou dans un bloc d’initialisation static
si c’est vraiment nécessaire).
Exemple :
private static final long MAX = 100000;
private static final String NAME = "MyBestSoft v1.2";
private static final String NAME_SEPARATOR = "::";
Java possède un système de génération automatique de documentation qui expose les parties (publiques par défaut) des classes.
Exemple :
public class Identity {
private String firstName;
private String lastName;
public Identity(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
public String displayName(boolean firstNameFirst) {
if (firstNameFirst)
return this.firstName+" "+this.lastName;
else
return this.lastName+" "+this.firstName;
}
public String toString() {
return displayName(true);
}
}
public class Student {
private Identity identity;
private int yearOfBirth;
private Degree degree;
private String degreeName;
public Student(Identity identity, int yearOfBirth) {
this.identity = identity;
this.yearOfBirth = yearOfBirth;
}
public String toString() {
return identity.displayName(false)+", "+age()+" years old";
}
public int age() {
return new GregorianCalendar().get(Calendar.YEAR)-yearOfBirth;
}
public void assignDegree(Degree degree, String degreeName) {
this.degree = degree;
this.degreeName = degreeName;
}
public Degree getDegree() {
return degree;
}
public String getDegreeName() {
return degreeName;
}
}
public enum Degree {
LICENSE, MASTER
}
La javadoc est créée avec la ligne de commande :
javadoc -link https://docs.oracle.com/javase/8/docs/api -d doc Degree.java Identity.java Student.java
Le résultat est le suivant.