Java : classes interne et locale
Achref El Mouelhi
Docteur de l’université d’Aix-Marseille
Chercheur en programmation par contrainte (IA)
Ingénieur en génie logiciel
[Link]@[Link]
Avril 2018, H & H: Research and Training 1 / 15
Plan
1 Classe interne
2 Classe locale
Avril 2018, H & H: Research and Training 2 / 15
Classe interne
Java
I
c
Classe interne ?
ELH
O U
Une classe définie à l’intérieur d’une autre
L M
f E et méthodes de la classe
Pouvant accéder aux attributs
r e
englobante
A ch
c
Avril 2018, H & H: Research and Training 3 / 15
Classe interne
Java
Considérant la classe Personne suivante
package [Link];
public class Personne {
I c
private String nom;
ELH
private String prenom; U
private int age;
L MO
f E
re nom, String prenom, int age) {
h
public Personne(String
c
c A = prenom;
[Link] =
[Link]
nom;
[Link] = age;
}
// + getters et setters
}
Avril 2018, H & H: Research and Training 4 / 15
Classe interne
Java
Hypothèse
Si on décide d’ajouter les deux propriétés suivantes dans la classe
Personne
I c
majoriteSexuelle : acceptant les valeurs majeur et mineur
H
EL adolescent, et
periode : acceptant les valeurs bébé,U
MO
enfant,
adulte
fE L
c h r e
c
A
Avril 2018, H & H: Research and Training 5 / 15
Classe interne
Java
Hypothèse
Si on décide d’ajouter les deux propriétés suivantes dans la classe
Personne
I c
majoriteSexuelle : acceptant les valeurs majeur et mineur
H
EL adolescent, et
periode : acceptant les valeurs bébé,U
MO
enfant,
adulte
fE L
Remarques c h r e
c A
Les deux propriétés dépendent de l’attribut age
On peut donc les regrouper ensemble dans une nouvelle classe
Cette nouvelle classe doit être placée dans Personne pour
qu’elle ait accès à l’attribut age
Avril 2018, H & H: Research and Training 5 / 15
Classe interne
Exemple de code pour la classe Categorie qu’on va définir dans Personne
public class Categorie {
private String majoriteSexuelle;
private String periode;
public Categorie() {
if (age >= 18) {
majoriteSexuelle = "majeur";
periode = "adulte";
I c
} else {
majoriteSexuelle = "mineur";
ELH
if (age < 2)
U
periode = "bébé";
L MO
else if(age < 12)
f E
hre
periode = "enfant";
else
c
c A
periode = "adolescent";
}
}
@Override
public String toString() {
return "Categorie [majoriteSexuelle = " + majoriteSexuelle + ",
periode = " + periode + "]";
}
}
Avril 2018, H & H: Research and Training 6 / 15
Classe interne
Modifions la classe Personne pour intégrer la classe Categorie
public class Personne {
private String nom;
private String prenom;
private int age;
private Categorie categorie;
public Personne(String nom, String prenom, int age) {
I c
[Link] = nom;
ELH
[Link] = prenom;
U
[Link] = age;
categorie = new Categorie();
L MO
f E
hre
}
c
c A
// + getters et setters
@Override
public String toString() {
return "Personne [nom = " + nom + ", prenom = " + prenom + ", age =
" + age + ", categorie = " + categorie + "]";
}
// + code de la classe Categorie
}
Avril 2018, H & H: Research and Training 7 / 15
Classe interne
Java
Pour tester
package [Link];
public class Main {
public static void main(String [] args) {
I c
Personne personne = new Personne("el mouelhi","achref
ELH
", 34);
U
[Link](personne);
L MO
}
f E
}
c hre
c A
Avril 2018, H & H: Research and Training 8 / 15
Classe interne
Java
Pour tester
package [Link];
public class Main {
public static void main(String [] args) {
I c
Personne personne = new Personne("el mouelhi","achref
ELH
", 34);
U
[Link](personne);
L MO
}
f E
}
c hre
c A
Le résultat sera
Personne [nom = el mouelhi, prenom = achref, age=34,
categorie = Categorie [majoriteSexuelle = majeur,
periode = adulte]]
Avril 2018, H & H: Research and Training 8 / 15
Classe interne
Java
Remarques
À la compilation deux fichiers, relatifs à la classe Personne, ont été
générés (d’extension .class)
I c
Le premier : Personne
LH
Le deuxième : Personne$CategorieUE
L MO
h r e fE
A c
c
Avril 2018, H & H: Research and Training 9 / 15
Classe interne
Java
Remarques
À la compilation deux fichiers, relatifs à la classe Personne, ont été
générés (d’extension .class)
I c
Le premier : Personne
LH
Le deuxième : Personne$CategorieUE
L MO
h r e fE
Attention
A c
c
l’age, les valeurs de periode et majoriteSexuelle
En changeant
ne seront pas mises à jour.
Avril 2018, H & H: Research and Training 9 / 15
Classe interne
Java
Remarques
À la compilation deux fichiers, relatifs à la classe Personne, ont été
générés (d’extension .class)
I c
Le premier : Personne
LH
Le deuxième : Personne$CategorieUE
L MO
h r e fE
Attention
A c
c
l’age, les valeurs de periode et majoriteSexuelle
En changeant
ne seront pas mises à jour.
Solution
Utiliser les classes locales.
Avril 2018, H & H: Research and Training 9 / 15
Classe locale
Java
Classe locale ?
I c
EL H
Une classe définie dans une méthode d’une autre
Pouvant accéder aux attributs etM
U
O de la classe
méthodes
englobante
fE L
h r e
caccéder aux paramètres de la méthode où elle est
c
définie
A
Pouvant aussi
Avril 2018, H & H: Research and Training 10 / 15
Classe locale
Java
Considérant la classe Personne suivante
package [Link];
public class Personne {
I c
private String nom;
ELH
private String prenom; U
private int age;
L MO
f E
re nom, String prenom, int age) {
h
public Personne(String
c
c A = prenom;
[Link] =
[Link]
nom;
[Link] = age;
}
// + getters et setters
}
Avril 2018, H & H: Research and Training 11 / 15
Classe locale
Java
Hypothèse
Nous allons garder les attributs de la classe Categorie
majoriteSexuelle : acceptant les mêmes valeurs majeur et
mineur I c
H
EL bébé, enfant,
periode : acceptant aussi les mêmesU
MO
valeurs
adolescent, et adulte
fE L
c h r e
c
A
Avril 2018, H & H: Research and Training 12 / 15
Classe locale
Java
Hypothèse
Nous allons garder les attributs de la classe Categorie
majoriteSexuelle : acceptant les mêmes valeurs majeur et
mineur I c
H
EL bébé, enfant,
periode : acceptant aussi les mêmesU
MO
valeurs
adolescent, et adulte
fE L
c h r e
c A
Remarques
La classe Categorie sera plutôt définie dans une méthode
(afficherDetails()) de la classe Personne
Elle sera aussi instanciée dans cette même méthode
Avril 2018, H & H: Research and Training 12 / 15
Classe locale
Java
La méthode afficherDetails() qu’on va ajouter dans Personne
public void afficherDetails() {
class Categorie {
private String majoriteSexuelle;
private String periode;
public Categorie() {
if (age >= 18) {
I c
majoriteSexuelle = "majeur";
periode = "adulte";
ELH
} else {
U
MO
majoriteSexuelle = "mineur";
L
if (age < 2)
periode = "bébé";
f E
hre
else if(age < 12)
periode = "enfant";
else
c
c A
periode = "adolescent";
}
}
@Override
public String toString() {
return "majoriteSexuelle=" + majoriteSexuelle + ", periode=" + periode;
}
}
Categorie categorie = new Categorie();
[Link]("nom= " + nom + ", prenom = " + prenom + ", " + categorie);
}
Avril 2018, H & H: Research and Training 13 / 15
Classe locale
Java
Pour tester
package [Link];
public class Main {
public static void main(String [] args) {
Personne personne = new Personne("el mouelhi","achref",34);
I c
[Link]();
ELH
U
MO
[Link](10);
[Link]();
}
f E L
}
c hre
c A
Avril 2018, H & H: Research and Training 14 / 15
Classe locale
Java
Pour tester
package [Link];
public class Main {
public static void main(String [] args) {
Personne personne = new Personne("el mouelhi","achref",34);
I c
[Link]();
ELH
U
MO
[Link](10);
[Link]();
}
f E L
}
c hre
c A
Le résultat sera
nom = el mouelhi, prenom = achref, majoriteSexuelle = majeur,
periode = adulte
nom = el mouelhi, prenom = achref, majoriteSexuelle = mineur,
periode = enfant
Avril 2018, H & H: Research and Training 14 / 15
Classe locale
Java
Remarques
I c
H
À la compilation deux fichiers, relatifs à la classe Personne, ont été
EL
générés (d’extension .class) U
L MO
Le premier : Personne
re f E
Le deuxième : c
A h
Personne$1Categorie ⇒ 1 étant l’indice de la
classe
c (les classes locales seront numérotées dans l’ordre
locale
et la première aura l’indice 1)
Avril 2018, H & H: Research and Training 15 / 15