Programmation oriente objets
et JAVA avanc
Unit 2: Concept Objet: Classe, Objet,
Hritage, classes abstraites et
interfaces
Redouane EZZAHIR
[Link]@[Link]
Plan de cours
Introduction JAVA
Concept Objet:
Classe, Objet, Hritage, abstraction, interfaces
Exceptions et Entres/sorties
Gnriques (types paramtrs)
Programmation concurrente (threads, synchronisation)
JDBC et API Java pour XML
Java Servlet & JSP
JSF (JavaServer Faces)
Hebirnate et JPA
Le Framework Maven
Plan pour aujourd'hui
Classes et objets
Accs aux membre et le mot cl this
Principe de la P.O.O :
1 objet 1e responsabilit
Encapsulation
Immutabilit (final)
Type et Classe
Dcouplage interface/implantation
Abstraction et concept dhritage
Principe de localit et polymorphisme
Programmation objet
Le but principal de la programmation
objet est d'aider la conception et la
maintenance de logiciels:
Modularit
Extensibilit
Polymorphisme
Rutilisabilit
Classes et objets
Pour un dveloppeur java tout est objet. Les objets classs
(en classes dobjets) par leurs caractres et fonctionnalits
communes.
Classe: Vehicule FormeGeometrique Animal
Classe java
Une classe java est une structure qui regroupe des
champs et des mthodes et qui forme une sorte de
moule partir duquel on cre des objets de
l'application que l'on est en train de dvelopper.
La cration d'un objet se fait par instanciation
(dmoulage) d'une classe.
champs class Point {
int x;
int y;
mthodes
void translate(int dx,int dy) {
x+=dx;
y+=dy;
}
}
Un objet
Un objet java est une variables, construit sur le
modle d'une classe instance d'une classe .
Il reprsente :
un objet physique (table, chaise, etc)
un concept (comparateur, manager, Iterateur, etc)
Il possde :
des donnes propres quil ne montre personne
des fonctionnalits accessibles tous
Il communique avec les avec les autres objets
Fonctionnalit Donnes de l'objet
question
rponse
Accs aux membres
L'accs aux mthodes d'une classe se
fait par la notation . sur une rfrence
un objet.
class Point { class AutreClass {
double rho;
double theta; void autreMethod(Point p) {
[Link](2.0,3.0);
void init(double x,double y) { [Link]([Link]);
rho=[Link](x,y);
theta=Math.atan2(x,y);
} }
} }
this
Le mot-cl this dsigne en permanence l'objet dans
lequel on se trouve c,,d quil correspond la
rfrence de l'objet sur lequel la mthode courante a
t appele
class Main { class Matrix {
public void toto() { boolean equals(Matrix m) {
Matrix m1=... if (this==m)
Matrix m2=... return true;
if ([Link](m2)) { ...
... }
} }
}
}
Ici, this aura la valeur de m1 et
m la valeur de m2
Principes de la lutte
Principaux principes de la programmation
objets :
1 objet 1e responsabilit
Encapsulation
Immutabilit (final)
Type et Classe
Dcouplage interface/implantation
Abstraction et concept dhritage
Principe de localit et polymorphisme
1 objet/1 responsabilit
Si l'on veut rutiliser des objets il ne faut
pas qu'il apporte trop de fonctionnalit
2 objets => 2 responsabilit, etc
Utiliser la dlgation entre objet (le fait
qu'un objet en connaisse un autre) pour
sparer les responsabilits
Exemple
On veut une application qui gre les
places de parking et calcule tout
instant combien le parking va rapporter
si toutes les voitures sortent maintenant
Le prix payer dpend uniquement du
type de voiture
Exemple (suite)
Ici, 4 responsabilit, 4 objets:
Parking: stocker des voitures
Voiture: la voiture en elle-mme
Modele: le modle de voiture
PrixModele: indique le prix en fonction d'un
modle
Exemple (fin)
Diagramme de classe correspondant
Parking PrixModele
+entrer(int,Voiture v) +getPrix(Modele):int
+sortir(int):voiture
Voiture 1 Modele
-matricule:String -nom:String
+getNom():String
+setNom(String)
Encapsulation
L'encapsulation est un principe qui garantie
qu'aucun champ d'un objet ne pourra tre
modifier pour corrompre l'tat d'un objet sans
une vrification pralable
L'tat de lobjet ne pourra tre modifi (s'il est
modifiable) que par des mthodes vrifiant les
donnes rentres
Encapsulation
Exemple d'un point en coordonne polaire
class Point { class AutreClass {
double rho; void autreMethod(Point p) {
double theta; [Link](2.0,3.0);
[Link]([Link]);
void init(double x,double y) {
rho=[Link](x,y); [Link]=-1; // aie aie !!
theta=Math.atan2(x,y); }
} }
}
La classe Point ne garantie pas l'encapsulation !
Solution : utiliser les modificateurs de visibilit
Visibilit et encapsulation
Un champs est toujours priv !!
class Point {
private double rho;
private double theta;
public void init(double x,double y) {
rho=[Link](x,y);
theta=Math.atan2(x,y);
}
}
class AutreClass {
void autreMethod(Point p) {
[Link](2.0,3.0);
[Link]([Link]); // ne compile pas
[Link]=-1; // ne compile pas
}
}
Visibilit et encapsulation (2)
toString pour laffichage!
class Point {
private double rho;
private double theta;
public void init(double x,double y) {
rho=[Link](x,y);
theta=Math.atan2(x,y);
}
public String toString() {
return rho+","+theta;
}
}
class AutreClass {
void autreMethod(Point p) {
[Link](2.0,3.0);
[Link]([Link]());
}
}
Mais il y a un problme
Supposons que l'on souhaite que rho ne soit
jamais gal zro class Point {
private double rho;
private double theta;
On peut obtenir la public void init(double x,double y){
rho =[Link](x,y);
valeur des champs theta=Math.atan2(x,y);
}
avant l'initialisation public String toString() {
return rho+","+theta;
}
}
Solution: constructeurs
class AutreClass {
void autreMethod(Point p) {
[Link]([Link]()); // affiche 0,0 oups
[Link](2.0,3.0);
}
}
Constructeur
class Point {
private double rho;
private double theta;
Le constructeur est crit
public Point(double rho,double theta) {
pour garantir les if (rho<=0)
throw new IllegalArgumentException(
invariants "illegal rho "+rho);
[Link]=rho;
[Link]=theta;
}
On ne peut crer un public String toString() {
return rho+","+theta;
objet sans appeler de }
constructeur }
public class AnotherClass {
public static void main(String[] args) {
Point p=new Point(2,3);
Point p2=new Point();
} // cannot find symbol constructor Point()
}
Constructeur par dfaut
Si aucun constructeur n'est dfini, le
compilateur rajoute un constructeur
public sans paramtre
public class Point {
private double x;
private double y;
public static void main(String[] args) {
Point p=new Point(); // ok
}
}
Appel inter-constructeur
public class Counter {
Appel un autre public Counter(int initialValue) {
[Link]=initialValue;
constructeur se fait }
public Counter() {
avec la notation }
this(0);
public int increment() {
this(...) return counter++;
}
private int counter;
}
public class AnotherClass {
public static void main(String[] args) {
Counter c1=new Counter();
[Link]([Link]());
this(...) doit tre la
Counter c2=new Counter(12);
[Link]([Link]()); premire instruction
}
}
Champs final
Il est possible de dclarer un champs
constant (final)
public class Point {
private final int x;
private final int y;
public Point(int x,int y) {
this.x=x;
this.y=y;
}
public Point() {
} //variable x might not have been initialized
Le compilateur vrifie que la valeur est assigne
une seule fois et par chaque constructeur
Diffrents types de mthodes
Classification des mthodes d'un objet
Constructeur
Initialise l'objet
Accesseur
Getter (getX)
Export les donnes (souvent partiellement)
Setter (setX)
Import les donnes (en les vrifiant)
Mthode mtier (business method)
Effectue des calculs en fonction des donnes
Accesseurs
public class Point {
Les accesseurs sont private double x;
private double y;
des mthodes
public Point(double x,double y) {
permettant l'accs this.x=x;
this.y=y;
des attributs }
public double getX() {
return x;
}
public void setX(double x) {
[Link] this.x=x;
}
public double getY() {
return y;
}
public void setY(double y) {
this.y=y;
}
}
Point p=new Point(1,1);
[Link]("%f,%f\n",[Link](),[Link]());
Intrt des accesseurs
public class Point {
private double rho;
Cela permet de private double theta;
changer public Point(double x,double y) {
init(x,y);
l'implantation sans }
private void init(double x,double y) {
changer le code rho=hypot(x,y);
theta=atan2(x,y);
d'appel. }
public double getX() {
return rho*cos(theta);
}
public void setX(double x) {
init(x,getY());
}
Point p=new Point(1,1); public double getY() {
[Link]("%f,%f\n" return rho*sin(theta);
,[Link](),[Link]()); }
public void setY(double y) {
init(getX(),y);
}
}
Type et classe
Les variables (locales ou champs) ont un
Type
Les rfrences ont une classe
public static void main(String[] args) {
String s=args[0];
Type Whale whale=new Whale(2,3);
}
Classe
Les Types objet (2)
Il existe 4 faons de dfinir un type objet :
Dfinir une classe
Dfinir une interface
(type que l'on ne peut pas instancier)
Dfinir une numration
(ensemble fini de valeurs,
pas instanciable non plus)
Dfinir une annotation
(sorte interface spciale)
Rutilisation (Hritage)
Pour raccourcir les temps dcriture et de mise au
point du code dune application, il est intressant
de pouvoir rutiliser du code dj utilis :
Rutilisation par des classes clientes
Dans une classe, on cre des instances de dautre classes
et on leurs demande des services.
Rutilisation avec modifications du code source
Besoin du code source de la classe
Rutilisation par lhritage
Besoin du code compil de la classe mre
On peut ajouter de nouvelles champs et nouvelles
mthodes ou modifier certaines mthodes
Hritage
Point FormeGeometrique
centre:Point
Exemple x:double
y:doule couleur:int
nom:String deplacer(x:int,y:int):void
deplacer(x:int,y:int):void
Cercle
L'hritage, c'est 3 choses : rayon:double
Rcupration des membres (hritage structurelle)
(cercle possde les champs
de FormeGeometrique)
Possibilit de redfinir les mthodes
(changer le code de deplacer ))
Sous-typage ( FormGeometrique est un sous-type de Cercle)
L'hritage concrtement
En Java, l'hritage se fait en utilisant extends.
public class Cercle extends FromeGemetrique{
final double rayon;
public Cercle(Point centre, double r, int couleur){...}
public class FromeGemetrique{
private Point centre;
final int couleur;
public FromeGemetrique(Point centre, int couleur) {
[Link] = centre;
[Link] = couleur ;
}
public void deplacer() {
[Link]();
}
}
Hritage et Object
En Java, toutes classes hritent de
[Link], directement ou
indirectement.
Directement : si l'on dclare une classe sans
hritage, le compilateur rajoute extends
Object.
Indirectement : si l'on hrite d'une classe celle-
ci hrite de Object (directement ou
indirectement)
C'est quoi le sous-typage
Le sous-typage, c'est le fait de pouvoir considrer
une rfrence une sous-classe comme tant une
rfrence une super-classe
Pile Tas
Et, concrtement : cercle @Cercle
forme
public static main(String[] args) {
cercle cercle=new cercle(new Point(0,0), 1, 5);
[Link](cercle);
FormeGeometrique forme = cercle; // sous-typage
[Link](forme);
}
Cercle est un sous-type de FromeGeometrique
Sous-Typage
En Java, tous les types objets sont
sous-types de Object.
La relation de soustypage vient de :
L'hritage, si A hrite de B, alors A est un
sous-type de B
L'implmentation d'interface, si A implante B
alors A est un sous-type de B
Plus des relations sur les tableaux
Les wildcards sur les types paramtrs
Hritage des membres
Une classe hrite de tous les membres de la
super-classe
public class Cercle extends FormeGeometrique{
final double rayon;
public static main(String[] args) {
Cercle cercle=new Cercle(new Point(0,0), 1.7, 5);
[Link]([Link] +" " +
[Link] +" " + [Link]);
}
} Tas
@Point
Pile
centre 5
cercle couleur
rayon
1.7
Hritage de champs
Il est possible de nommer un champs de
faon identique dans une sous-classe
public class Cercle extends FigureGeometrique{
final double rayon;
Color couleur;
public Color getColor() {
return [Link];
}
}
public class FigureGeometrique{
Les deux champs int couleur;
Point centre;
cohabitent public int getColor() {
return [Link];
}
}
Masquage de champs
On dit que le champs couleur de Cercle masque
le champs couleur de FormeGeometrique
public class Cercle extends FormeGeometrique{
final double rayon;
Color couleur;
public String toString() {
[Link]("%d", super. couleur);
..
}
}
public class FormeGeometrique{
super. permet d'accder int couleur;
Point centre;
au champs de la public int getColor() {
return [Link];
super classe }
}
Champs et Sous-typage
On accde au champs en fonction du
type de la rfrence
public static main(String[] args) {
Cercle cercle =new Cercle();
[Link]([Link]);
FormeGeometrique forme= cercle; // sous-typage
[Link]("%d", [Link]);
}
Tas
@Point
@Cercle
Pile centre @Color
couleaur
cercle rayon
forme couleur 0 1.5
Hritage et constructeur
La premire instruction d'un constructeur est un
appel au constructeur de la superclasse
public class Cercle extends FormeGeometrique{
final double rayon;
public Cercle() { // implicite
super(); // bang
}
} // cannot find symbol constructor FormeGeometrique()
Le constructeur implicite fait appel au
constructeur par dfaut de la superclasse
super(...) et appel implicite
super(...) doit tre la premire
instruction du constructeur
Si l'instruction super(...) n'existe pas, le
compilateur ajoute un appel au
constructeur par dfaut de la classe
mre (super())
Constructeur et Superclasse
Lappel super(...) permet dinitialiser les champs (private) hrits
Mais attention!
Les arguments de super sont compils dans un contexte statique
class Cercle extends FormeGeometrique{
private final static Point DEFAULT_CENTRE= new Point(0,0);
private final int DEFAULT_COLOR = 0;
public Cercle() {
super(DEFAULT_CENTRE, DEFAULT_COLOR); // erreur
}
}
class FormeGeometrique {
private Point centre;
private int couleur;
public FormeGeometrique(Point centre, int couleur) {
[Link] =centre;
[Link]=couleur;
}
}
Constructeur vs Mthode
La grosse diffrence entre un constructeur et
une mthode, c'est que l'on n'hrite pas
des constructeurs
Le constructeur de la classe hrit a pour
mission de :
demander l'initialisation de la classe mre au
travers de son constructeur
d'initialiser ses propres champs
Hritage de mthode
En tant que membre, une sous-classe hrite des
mthodes de la superclasse
public class Cercle extends FromeGemetrique{
final double rayon;
public Cercle(Point centre, double r, int couleur){
super(centre, couleur);
[Link] = r;
}
public static main(String[] args) {
Point p = new Point(0,0);
Cercle c1 =new Cercle(p, 1, 5);
[Link](2, 2); // ok
Cercle c2 = Cercle(null, 1, 5);
[Link](2, 2); // ok but,
//Exception in thread "main" [Link]
}
}
deplacer() ne vrifie pas le champs centre
Redfinition de mthode
Il est possible de redfinir le code de
deplacer() dans Cercle
public class Cercle extends FromeGemetrique{
final double rayon;
public Cercle(Point centre, double r, int couleur){
super(centre, couleur);
[Link] = r;
}
public void deplacer() {
if(centre==null){
[Link]("impossible de deplacer cet cercle" );
}
else [Link]();
}
Assurer la redfinition
L'annotation@Override indique au
compilateur de gnrer une erreur si
une mthode ne redfinit pas une autre
public class Cercle extends FromeGemetrique{
final double rayon;
public Cercle(Point centre, double r, int couleur){
super(centre, couleur);
[Link] = r;
}
public @Override void deplacer() {
if(centre==null){
[Link]("impossible de deplacer cet cercle" );
}
else [Link]();
}
Redfinition vs Surcharge
La surcharge correspond avoir des
mthodes de mme nom mais de profils
diffrents dans une mme classe
La redfinition correspond avoir deux
mthodes de mme nom et de mme
profils dans deux classes hrits
Redfinition ou Surcharge
Exemple de surcharge et de redfinition :
public class A {
public void m(int a) {...} // surcharge
public void m(double a) {...} // surcharge
}
public class B extends A {
public void m(long a) {...} // surcharge
public void m(double a) {...} // redfinition
}
m(double) de B redfinie m(double) de
A, le reste est de la surcharge
Mthodes et Sous-typage
On accde aux mthodes en fonction du type
rel de la rfrence Pile Tas
cercle @Cercle
forme
public static main(String[] args) {
Cercle cercle=new Cercle(...);
[Link](1,1)); // Cercle::deplacer()
FormeGeometrique frome=cercle; // sous-typage
[Link](1,1); // toujours Cercle::deplacer()
}
Comme il y a redfinition, la mthode deplacer()
de FormeGeometrique n'est pas accessible
Redfinition et super.
La notation super. permet d'avoir accs aux
membres non static de la superclasse
public class Cercle extends FromeGemetrique{
final double rayon;
public Cercle(Point centre, double r, int couleur){
super(centre, couleur);
[Link] = r;
}
public void deplacer() {
if(centre!=null){
[Link]();
}
[Link]() ne marche pas.
Accs hors de la classe
Il n'est pas possible d'accder aux mthodes
redfinies hors de la sous-classe
Il n'est pas possible d'accder la mthode
deplacer() de FormeGeometrique
public static main(String[] args) {
Cercle cercle=new Cercle(...);
[Link](1,1)); // Cercle::deplacer()
FormeGeometrique frome=cercle; // sous-typage
[Link](1,1); // cannot find symbol class
// FormeGeometrique
}
super. se marche que dans la sous-classe
Mthode final
Si une mthode est dclare final, celle-ci ne peut
tre redfinie
Important en terme de scurit
Peu, voire pas d'impact en terme de performance
public class PasswordValidator {
public final boolean checkPassword(char[] password) {
...
}
}
public class YesValidator extends PasswordValidator {
@Override public boolean checkPassword(char[] password) { // illgal
return true;
}
}
Classe final
Si une classe est dclare final, il est impossible
de crer des sous-classes
Mmes raisons que pour les mthodes
public final class PasswordValidator {
public boolean checkPassword(char[] password) {
...
}
}
public class YesValidator extends PasswordValidator { // illgal
...
}
Toutes les mthodes se comportent comme si
elles taient final
Hritage Multiple
Problmes de l'hritage multiple :
Si on hrite de deux mthodes ayant mme
signature dans deux super classes, quelle code
choisir ?
Performance en cas de sous-typage
Solution :
Il n'y a pas d'hritage multiple en Java
Java dfinit des interfaces et permet une
classe d'implanter plusieurs interfaces
Interface
Une interface dfinit un type sans code
On utilise le mot-cl interface
public interface List {
public Object get(int index);
public void set(int index,Object element);
}
Une interface dclare des mthodes sans
indiquer le code (implantation) de celles-ci
On dit alors que les mthodes sont abstraites
Instanciation d'interface
Il n'est pas possible d'instancier une
interface car celle-ci ne dfinie pas le code
de ses mthodes
public interface List {
public Object get(int index);
public void set(int index,Object element);
}
public class Main {
public static void main(String[] args) {
List list=
new List(); // illgal
}
}
Implantation d'interface
Implanter une interface consiste dclarer une
classe qui fournira le code pour l'ensemble des
mthodes abstraites
public interface List {
public Object get(int index);
public void set(int index,Object element);
}
public class FixedSizeList implements List {
public FixedSizeList(int capacity) {
array=new Object[capacity];
}
public Object get(int index) {
return array[index];
}
public void set(int index,Object element) {
array[index]=element;
}
private final Object[] array;
}
Implantation d'interface (2)
Le compilateur vrifie que toutes les mthodes de
l'interface sont implantes par la classe
public interface List {
public Object get(int index);
public void set(int index,Object element);
}
public class FixedSizeList implements List {
// FixedSizeList is not abstract and does not
override
// abstract method set(int,[Link])
public FixedSizeList(int capacity) {
array=new Object[capacity];
}
public Object get(int index) {
return array[index];
}
private final Object[] array;
}
Interface et Sous-typage
Le fait qu'une classe implante une interface implique
que la classe est un sous-type de l'interface
public class AtWork {
private void print(List list) {
for(int i=0;i<[Link]();i++) {
[Link]([Link](i));
}
}
public static void main(String[] args) {
List l=new FizedSizeList(5);
...
print(l);
}
}
Permet d'crire une mthode gnrique
Appel une mthode d'une interface plus lent !
Hritage d'interface
Une interface peut hriter d'une ou plusieurs interfaces
Les mthodes de cette interface correspondent
l'union des mthodes des interfaces hrites
public interface Channel {
void close();
}
public interface ReadChannel extends Channel {
int read(byte[] buffer);
}
public interface WriteChannel extends Channel {
int write(byte[] buffer);
}
public interface RWChannel extends ReadChannel, WriteChannel
{
}
Interface, mthodes et champs
Les mthodes dclares dans une interface sont
obligatoirement :
abstraite (abstract)
publique (public)
Impossible de dfinir une mthode statique dans
une interface
Les champs dclars dans une interface sont
obligatoirement :
constant (final)
public (public)
statique (static)
Mthode publique
Impossible d'implanter une mthode d'une
interface avec une visibilit autre que public
public class FixedSizeList implements List {
public FixedSizeList(int capacity) {
array=new Object[capacity];
}
// get(int) in FixedSizeList cannot implement
// get(int) in List; attempting to assign
// weaker access privileges; was public
Object get(int index) {
return array[index];
}
...
private final Object[] array;
}
Interface et constantes
Eviter pour rcuprer des constantes
d'implanter une interface
public interface Orientation{
int NORD =0, SUD =1, EST= 2, OUEST=3 ;
public int getDirection();
}
public class Boussole implements Orientation{
Boussole() {
currentDirection = NORD ;
}
...
Ici, on dclarera plutt une numration
(cf plus loin)
@Override
En 1.5, @Override indique que l'on redfinie
une mthode, marche pas pour les mthodes d'interface
En 1.6, @Override pour dire qu'une mthode implante une
mthode dfinie par l'interface.
public class Boussole implements Orientation{
Boussole() {
currentDirection = NORD ;
}
@Override public int getDirection() {
return currentDirection ;
} // 1.6 ok
// 1.5: method does not override a method from
// its superclass
Classe abstraite
Il est possible de dfinir en Java des classes
ayant des mthodes abstraites
public interface List {
public boolean isEmpty();
public int size();
}
public abstract class AbstractList implements List {
public boolean isEmpty() {
return size()==0;
}
}
Une classe abstraite est une classe partiellement
implante donc non instanciable
Raffinement de l'abstraction
Une classe abstraite peut s'intercaler
dans l'arbre d'hritage entre l'interface et
les classes concrtes <<interface>>
Vehicle
<<interface>>
Vehicle
Cycle
BiCycle MotoCycle
BiCycle MotoCycle
AVANT APRES
Intrt des classe abstraite
Permet de partager du code commun des
sous-classes
public abstract class Cycle implements Vehicle {
private Roue avant, arriere;
public void sautPerilleuxArriere() {
freinage(avant);
}
protected abstract void freinage(Roue roue);
Le code commun peut supposer la prsence
de certaine mthodes (donc abstraites)
La classe Objet
Toutes les classes hritent de [Link]
directement ou indirectement.
Un objet en Java possdent donc par hritage
toute les mthodes dfinies dans la classe Object
public class ClassExample {
public static void main(String[] args) {
Truc truc=new Truc();
Object o=truc;
}
}
Toute classe est un sous-type de Object
Classe et Objet
La mthode getClass() sur un Object permet
d'obtenir un objet de type Class reprsentant
la classe de l'objet
public class ClassExample {
public static void main(String[] args) {
String s="toto";
Object o="tutu"; // sous-typage
[Link]([Link]()); //
[Link]
boolean test=[Link]()==[Link]();
[Link](test); // true
}
}
Lobjet de type Class permet de rechercher
les membres d'un objet par leur nom
Test dynamique de type
Il est possible de tester si un objet est un sous-
type d'un type particulier grce l'oprateur
instanceof
public class ClassExample {
public static void main(String[] args) {
Object o;
if ([Link]!=0)
o=args[0];
else
o=new Object();
boolean test=o instanceof String;
[Link](o); // true ou false
}
}
Le transtypage
On appelle transtypage le fait de voir une
rfrence sur un type comme une rfrence
sur un sous-type
public class ClassExample {
public static void main(String[] args) {
Object o;
if ([Link]==0)
o="tutu";
else
o=new Object();
String s=(String)o;
// peut faire l'excution un ClassCastException
}
}
Attention cette opration peut lever une
exception ClassCastException
Assurer le transtypage
Il est possible d'assurer un transtypage
sans lever d'exception en utilisant
instanceof
public class ClassExample {
public static void main(String[] args) {
Object o;
if ([Link]!=0)
o=args[0];
else
o=new Object();
if (o instanceof String) {
String s=(String)o;
doSomeStuff(s);
}
}
}
Mauvais usage du instanceof
Le instanceof ne doit pas se
substituer au polymorphisme
public static void renderLoop(GItem[] items) {
begin(); GItem
for(GItem item:items) {
if (item instanceof Circle)
renderCircle((Circle)item);
else Circle Triangle
renderTriangle((Triangle)item);
}
end();
}
Moins maintenable, et si grosse hirarchie,
beaucoup moins performant
Utiliser le polymorphisme !
GItem dfinie une mthode abstraite render,
Circle et Triangle l'implante
public static void renderLoop(GItem[] items) {
begin();
for(GItem item:items) {
render (item);
}
end();
}
GItem
Circle Triangle
Note sur le transtypage
Utilisation classique du transtypage :
Les containers gnrique utilisent Object
public static void main(String[] args) {
ArrayList list=new ArrayList();
[Link]("toto");
String s=(String)[Link]();
}
Le transtypage n'est pas necessaire en 1.5
public static void main(String[] args) {
ArrayList<String> list=new ArrayList<String>();
[Link]("toto");
String s=[Link]();
}