Académique Documents
Professionnel Documents
Culture Documents
Developper Des Applications en Java
Developper Des Applications en Java
15 juin 1999
Prsentation du langage
1.1 Introduction
Le langage
jv
1.2 Philosophie
1.2.1 Un langage orient objet
L'orientation objet s'est progressivement impose comme technologie de dveloppement, laissant esprer dans la conception des applications:
plus de rutilisation (du code, mais aussi de l'architecture)
une plus grande ractivit au changement
un moindre cot de maintenance
gCC et mlllk . jv
gCC en ce qui concerne le
jv
tin tre interprt par une machine virtuelle, habituellement dsigne sous
le nom de JVM. Les spcications prcises tant du peudocode que du modle
d'excution de la JVM font partie intgrante des spcications du langage.
et
compile dans un environnement peut tre excute dans n'importe quel autre.
Bien sr quelques prcautions sont prendre:
Un constructeur peut respecter les spcications de la machine virtuelle
tout en introduisant des extensions. Si une application tire partie de ces
extensions, elle ne pourra fonctionner que dans les environnement les implmentant.
Un programme raliste doit procder avec le monde extrieur (le systme
chier, l'interface utilisateur, les bases de donnes). Les concepteurs du
langage ont fait de leur mieux pour rendre portable cet interfaage, mais
il n'est pas toujours possible de cacher le problme au dveloppeur qui
a besoin des fonctionnalits spciques d'un environnement.
Un seul langage n'tant pas toujours susant pour toutes les applications,
certains programmes peuvent devoir utiliser l 'ouverture de
jv
pour
g, or celle-
ci, bien que plus imparfaite, tait dj assez bonne pour tre un des facteurs de
son succs. La portabilit de
jv
est donc
trs
satisfaisante.
quelle source. Ceci est videmment trs adapt au Web, et a donn naissance
la notion d'applet, mini-applications pouvant fonctionner dans un browser sans
que l'utilisateur ait eu se procupper de leur installation, et qui ont t l'un
des principaux facteurs de l'explosion mdiatique de
jv,
mme si l'intrt du
1.4 Le march
La popularit de
jv
langage de programmation: le grand public peut voir son nom dans tous les
media! De faon plus concrte pour son succs industriel, beaucoup d'entreprises
s'y sont intresses:
Du point de vue du style de dveloppement, il remplit un crneau non
encore occup dans la gamme des langages orients objet (il reste proche
de
gCC,
mlllk ),
gCC.
L'orientation ob jet
rednir
certaines
autre type dont il a besoin, d'autre part tant qu'un langage ne comporte pas
des assertions smantiques (elles ont envisages pour
jv
et de
gCC),
jv
gCC
crire du code
g,
ment typ.
jv
mlllk
qui soit en dehors d'une classe, toute classe dnie par l'utilisateur drive
d'une classe prdnie ( Objet).
Il est aussi fortement typ que
Par ailleurs,
gCC
jv s'est appuy sur une syntaxe trs proche de celle du gCC, aprs
avoir limin les complexits les plus redoutables, au prix bien sr de se priver
de certaines possibilits.
jv
gCC
qui, pour satisfaire les besoins en performance d'une partie de son march,
laisse au dveloppeur le soin de spcier allocation et dallocation. Le Garbage
Collection a longtemps eu trs mauvaise rputation, cause de certaines implmentations de Lisp o l'excution de cette phase provoquait des pauses
trs
Les programmes
java
jv
car le dveloppeur ne peut dnir que des classes. Le composant de base est donc
la classe. Les classes peuvent, nous l'avons dit tre regroupes en packages. les
packages jouent deux rles:
1. Ils reprsentent un espace de nommage, analogue au
nmespe
de
gCC.
Ceci vite entre autres les collisions de noms entre fournisseurs de composants.
2. Ils fournissent un niveau particulier de protection: il y a en
en
gCC,
jv,
comme
puli :
Mais contrairement
pkge testY
ou
pkge omFomgFgorY
Comme on le voit dans ce dernier exemple, les packages peuvent tre imbriqus.
Une classe sans spcication de
pkge
ckage global au nom vide. Les packages (non vides) font partie intgrante du
nom de la classe, ainsi dans
pkge testY
puli lss fenhmrk {FFF}
le nom complet de la classe est
testFfenhmrk .
kge testY
import frmeworkFBY
6
import :
kge testY
import frmeworkFepplitionY
puli lss fenhmrk {
FFF
epplition ppanew epplition@AY
FFF
}
Fjv .
Une classe
peut avoir besoin de classes auxiliaires prives, celles-ci peuvent tre dnies
dans le mme chier source, mme si elles donneront lieu une unit de code
compil indpendante. D'autre part, depuis jdk1.1, on peut dnir des classes
intrieures une autre classe. Pour le code compil d'une classe appartenant
un package, les segments du nom du package sont traduits non pas directement
dans le nom de chier mais par des sous-rpertoires successifs. Ainsi le code
compil de la classe
testFfenhmrk
xxx testfenhmrkFlss
Bien qu'il soit souhaitable de respecter une cohrence identique pour les sources,
aucune contrainte n'est impose sur celles-ci, ni par la spcication, ni par les
outils.
3.2.3 La compilation
Dans le cas du jdk, la compilation est excute en lanant depuis la ligne de
commande l'utilitaire
jv .
La syntaxe est:
Elsspth
Ed
Y
Ed
jv Ed gXdevlsses enhmrkFjv
produira (en supposant que nous soyons dans le rpertoire o se trouve le source
de la classe
testFfenhmrk )
le chier:
gXdevlssestestfenhmrkFlss
lsspth est interprt de la mme faon, et si fenhmrk
frmeworkFepplition dont le compil se trouve dans:
rfrence la classe
gXdevlssesfrmeworkepplitionFlss
l'argument de
Elsspth
gXdevlsses
jv
compiles
Elsspth
lateur.
min.
tre:
min@A
d'exporter d'autres mthodes. Les deux cas les plus frquemment rencontrs
sont:
L'environnement d'excution d' applets au sein d'un navigateur web. Les
applets sont des classes
jv
HTTP.
L'excution d'un servlet est dclenche par la rception par le serveur d'une
requte dont l' url rfrence ce servlet.
jvFlng
jv
l'autorisait:
yjet ,
les classes
tring
et
tringfuffer
dj rencontres, la classe
la classe utilitaire
jvFio
minaux).
jvFwt
jv depuis sa sortie
jvxFswing .
jv
jvx
jvxFswing
jvx
est base sur ce que l'on appelle en gnral pudiquement des raisons
socio-historiques.
est un langage fortement typ, ce qui veut dire que toute variable doit
tre dclare et type avant qu'on puisse y faire rfrence, et que toute expression
10
yte sur 8 bits (attention, en gGgCC , yte est souvent unsigned hr)
short sur 16 bits
int sur 32 bits
long sur 64 bits
unsigned
Le modicateur
jv.
n'existe pas en
gCC
chines o les tailles concident. Le fait que la taille de ces types soit
justement , en
jv,
doivent
coller la
hr
gCC,
9uxxxx 9
o
xxxx
oolen
sibles sont
void
true
ou
flse
gr HY
en supposant que Car soit une classe dnie dans un package courant ou
import, sa signication est que l'identicateur o1 est une variable qui
dnote un objet de type Car. L'instruction:
HaIY
ne signie pas que
I.
Si
HFattribute avalue Y
en admettant que
11
gr
possde au moins un
HFmodifyingMethod @AY
gr
en admettant que
possde au moins
xxxFuse@HAY
ce n'est pas une copie qui est transmise, mais bien une rfrence partage
sur l'objet initial, et si la mthode appele modie cet objet ci-dessus,
ces modications seront visibles travers
H.
excute
ranothergrY
H
sont
toujours
passs
par valeur ,
jv,
3.
length
tance dclare
finl .
par la syntaxe:
rryi
la machine virtuelle vriant que la valeur de
rryianewelementY
Les tableaux multi-dimensionnels sont raliss comme des tableaux de
tableaux.
12
tring ,
laquelle le compilateur
gGgCC
( rello
l'oprateur
est
tring
tring
modie: en eet les seuls membres d'instance non privs sont des mthodes
non modiantes. Les mthodes dont le nom semble modiant gnre en fait
de nouvelles chanes Dans le code suivant:
tring
et vice-versa.
gGgCC . L'initia-
lisation est optionelle, son absence impose certaines contraintes. Une dclaration
peut concerner:
1. Une variable membre
(a) d'instance
(b) de classe, la dclaration ci-dessus est alors prcde du mot-clef
stti
hr)
Pour un oolen , flse
H
9uHHHH9
pour
13
null,
Dans le cas 2, aucune valeur par dfaut n'est aecte, mais le compilateur exige
de pouvoir se convaincre que la variable recevra une valeur avant toute utilisation.
Une variable peut aussi tre qualie de
finl ,
prendre qu'une seule valeur au cours de son cycle de vie. L plus encore, en
l'absence d'initialisation, les exigences du systme sont variables:
Dans le cas 2, le mcanisme est le mme que pour les variables non
finl ,
jv
Dans le cas 1(a), les valeurs par dfaut ne sont pas utilises,
teur
tout construc-
finl
intressant, car il permet de dclarer des attributs non modiables dont la valeur
dpend nanmoins des arguments du constructeur.
returnEtype
mthode, ou bien
rgumentElist
void.
spare par des virgules, qui dcrit les arguments attendus par la mthode.
Cette liste peut tre vide.
optionlEthrowsEluse
throws exeptionElist ,
methodfody
return-type
void,
return
return-type .
est identique
14
, rello , ynenwo .
tringX
for
en
cours d'excution.
(c) Un argument de la mthode ou du constructeur en cours d'excution.
(d) L'identicateur li l'exception en cours de traitement si un bloc de
traitement d'exception est en cours d'excution.
(e) Une variable membre d'instance de
thisD
si la mthode en cours
jamais
jv,
une
une autre variable locale de mme nom qui serait visible au point de la
nouvelle dnition.
15
3. Les oprateurs :
(a) unaires:
CC, EE, C, E, , 3
gGgCC , CC et EE
Comme en
B, G, 7
CD E
de shift: `#`, b#b, `#`#`D b#b#b
de comparaison: `D `a , bD ba
d'galit: aaD 3a
de manipulation binaire: 8, |D
logiques: 88D || ,
i. multiplicatifs:
ii. additifs:
iii.
iv.
v.
vi.
vii.
(c) ternaire:
@type Aexpr
expr instneof referenceType
a, et op aD op
: expr index
F :
expr FattrName
referenceType FattrName
BxCy
a la mme signication que
@BxACy
16
C@xByA
Contrairement
gGgCC , D
n'est
jamais
comme sparateur, dans les cas suivants (certains font rfrence des notions
dnies dans des sections ultrieures):
entre plusieurs variables dclares simultanment
entre les paramtres formels d'une dclaration de mthode ou de constructeur
entre les argments passs lors d'une invocation de mthode ou d'une instantiation d'objet
entre plusieurs interfaces hrits par un mme interface ou une mme
classe
entre plusieurs exceptions dclares leves dans une dclaration de mthode
entre plusieurs instructions-expressions dans le code d'initialisation ou
d'itration d'une instruction
for.
finl
ayant dj t initiali-
se.
(b) le type du membre droit doit tre compatible avec celui du membre
gauche (c'est--dire tre susceptible d'une conversion implicite dans
celui-ci, voir plus loin des remarques additionnelles sur ce que signie
la compatibilit pour les types primitifs)
(c) le membre gauche doit aussi satisfaire toutes les conditions d'accessibilit, mais ceci n'est pas une condition lie l'oprateur d'affectation, mais intrinsque toute expression.
17
2. Les oprateurs
CC
et
EE
tation.
3. Nous avons dcrit plus haut quelles taient les conversions explicites et implicites valides entre types rfrence. Bien que les types primitifs se situent
en dehors de l'orientation objet, d'une certaine faon le type
extension du type
short .
int
est une
oolen
numriques et le type
en
flse ).
null
des cas o une conversion implicite peut amener une perte silencieuse de
prcision:
int iaIPQRSTUVWHY
flot faiY
flot n'a pas susamment de prcision pour conserver tous les chires
i. Le mme problme se pose en aectant un long un
doule .
Un
signicatifs de
4. Une consquence de l'application stricte des rgles qui prcdent est que
la dernire instruction du bloc suivant gnre une erreur de compilation:
short saPY
int iaQY
short taiBsY
En eet, la division est comprise comme
int
un
short ,
short ta@shortA@iBsAY
ou
short ta@shortAiBsY
Le compilateur admet une exception cetter rgle pour les aectations de
constantes calculables la compilation, ce qui est bien agrable car il n'y
a pas de constantes lexicales entires en dessous de l'
int.
Par exemple:
short saIY
est lgal, sans ncessiter
@shortAI .
18
short ,
que
les
il faudra
5. Comme nous l'avons dj vu, les conversions implicites des type primitifs
vers
le type
tring
H,
erithmetiixeption
utilisent les notions IEEE d'innit et de NAN (NotANumber ), et ne provoquent jamais d'exception.
gGgCC .
groupes en deux catgories, les instructions composes, qui peuvent contenir d'autres instructions , et les instructions simples, qui ne peuvent pas. Par
ailleurs, toute instruction peut optionellement tre prcde d'une tiquette,
sous la forme:
identificateur X
instruction
le sparateur de ligne n'tant pas obligatoire.
Y,
que nous
CC
et
EE),
(autre que
void)
dclar.
4. L'instruction
peut optionnellement tre suivi d'un identicateur qui doit tre celui d'une
tiquette d'une instruction compose englobant l'instruction courante. Si
cette tiquette est spcie, elle identie l'instruction cible. Sinon, l'instruction cible est l'instruction compose de type boucle (
do)
ou
swith
for, while ,
ou
rek .
19
return
type de retour).
5. L'instruction
ontinue :
ontinue
peut optionnellement tre suivi d'un identicateur qui doit tre celui d'une
tiquette d'une instruction compose englobant l'instruction courante. Si
cette tiquette est spcie
tion de boucle ,
ontinue .
throw :
sa syntaxe est:
throw exceptionExpr
exceptionExpr devant s'valuer comme une instance drive de hrowle
(normalement ixeption ), et son eet est de lever l'exception en question,
et de transfrer abruptement le contrle d'excution au premier point de
code appelant ayant dclar traiter une exception de ce type (voir plus
loin l'instruction
try).
{}
{
synhronized@expr A.
expr doit s'valuer comme une rfrence non null un objet. Si expr possde un type primitif, le compilateur rejetera l'expression. Sinon, et si expr
s'value comme null , une exception sera leve l'excution
{
defultX
soit:
se constantExpr X
20
les
de la compi-
exp r
FFFX
et si l'tiquette
defult
try tryBlock
th@ExceptionClass id A handlerBlock
FFF
[ finlly finalBlock]
block
la clause
th
[]
FFF
signiant que
finlly est optionelle (en ralit un tel bloc peut aussi comporter une
clause finlly sans aucune clause th ). Les ExceptionClass doivent
tre des types rfrences drivs de hrowle . A l'excution:
(a)
tryBlock
est excut.
(b) Si une exception est leve et non traite l'intrieur de cette excu-
th :
id
handlerBlock
de la premire telle
ii. si l'excution de ce bloc lve une nouvelle exception, elle est propage vers les niveaux suprieurs
(c) Si aucune clause ne satisfait la condition prcdente, l'exception originelle est propage vers les niveaux suprieurs.
(d) Si une clause
i.
finlly
aprs terminaison du
mainBlock
et/ou
ii. si cette excution lve une exception, elle est propage vers les
niveaux suprieurs, remplaant ventuellement l'expression mentionne en (b)ii ou (c).
21
6. L'instruction
for:
la syntaxe en est:
for
se dcompose ainsi:
(a) Initialisation:
i. Si
init
init
for.
l'ordre.
(b) Itration:
i. Si
l'instruction
ii.
tame.
7. L'instruction
while :
la syntaxe en est:
booleanExpr
renvoie
flse ,
l'instruction
while
est termine
(b) Sinon,
statement
8. L'instruction
do:
la syntaxe en est:
Y.
statement
est excut
(b) Si l'valuation de
booleanExpr
renvoie
flse ,
22
l'instruction
do
est
lss glssxme {
GG dlrtion des memres
}
les membres tant des variables ou des mthodes, d'instance ou de classe, et
des constructeurs. La dclaration d'un membre de classe est identie en tant
prcde du qualicateur
une classe intrieure). Nous savons dj que la classe peut tre optionellement
dclare
qualicateur de protection,
5.2 Attributs
La dclaration d'une variable membre est identique la dclaration d'une
finl , applicable galement aux vastti , applicable galement tous les membres
trnsient , li la srialisation
voltile , li la concurrencr
5.3 Mthodes
Les mthodes sont, en
qu'on ne peut
rien
jv,
this
5.4 Constructeurs
Un constructeur est une pseudo-mthode n'ayant pas de spcication de type
de retour, et dont le nom est celui de la classe. Bien que le constructeur soit
23
plus proche d'une mthode de classe que d'une mthode d'instance, la pseudovariable
this
classe peut possder plusieurs constructeurs, toujours direncis par leurs listes
d'arguments. Si aucun constructeur n'est dclar, un constructeur implicite,
public, sans arguments, et avec un corps vide, est gnr.Un constructeur peut
en appeler un autre par une utilisation patriculire de
this:
d'arguments qui lui est pass. L'exemple ci-dessus permet de raliser une notion
de valeur par dfaut de l'argument
Un appel
this
size.
Attention:
this
vranew glssxme@rgsAY
la liste d'arguments pouvant bien sr tre vide. Cette syntaxe est la seule pouvant dclencher la cration d'un objet. Dans le cas des tableaux, que nou savons
tre des classes dguises, le constructeur est accessible par une syntaxe particulire:
null,
tableaux de
pBq
lments
ou
tring
24
null.
lements de
5.5 Destruction
Comme on l'a dit, la destruction d'un objet n'est jamais demande explicitement par le programme. Un objet vit tant qu'il est rfrenc, les rfrences
pouvant provenir directement:
1. d'une variable locale
2. d'une variable membre de classe d'une classe charge
3. d'une variable membre d'instance d'un objet vivant
4. d'un lment d'un tableau, ce qui est une variante particulire du cas
prcdent, et trs rpandue: tous les containers existant couramment
utilisent en dnitive un tableau.
Ds qu'un objet n'est plus rfrenc, la machine virtuelle est libre de librer son
espace mmoire, grce au Garbage Collector mentionn plus haut. Nanmoins,
l'initialisation de l'objet peut avoir allou des ressources prcieuses (comme des
connexions rseau) dont la machine virtuelle n'est pas consciente. Une mthode
particulire:
gCC.
Nanmoins, si la machine virtuelle est tenue de dtruire les objets non rfrencs
avant de se plaindre qu'il n'y a plus de mmoire pour en crer de nouveaux, et,
si possible avant que l'utilisateur ne se plaigne que l'application rame (!), elle
est, dans ces limites, totalement libre du moment de ces destructions, et de leur
ordonnancement. Ceci, joint au fait que le dveloppeur ne peut pas choisir entre
allocation dynamique des objets et allocation automatique sur la pile, fait que
le rle du naliseur est beaucoup moins crucial et prpondrant qu'en
gCC.
5.6 Hritage
Une classe peut hriter d'une autre. La syntaxe pour ceci est:
super ,
de forcer l'appel une mthode dnie dans la classe de base, quand celleci a t rednie dans la classe courante. Ceci est en particulier utile quand
une rednition veut s'appuyer sur la dnition de base.
25
thisX
super@rgsAY
En fait tout constructeur d'une classe drive ne contenant pas d'appel explicite
this@FFFA
super@FFFA
ou
En fait, toutes les classes autres qu' yjet qui ne comportent pas de clause
une clause
des classes
de
fseX
herived
fse,
fse
herived ,
fse
de rfrence
herived ,
ce qui est la
base du polymorphisme.
2. Une expression de type
herived
par la syntaxe:
@herivedAexpr
qui sera accepte par le compilateur, mais qui pourra donner lieu une
erreur l'excution, si la promesse correspondante n'est pas tenue. Ceci
s'applique aussi au cas o
ou un interface qui n'est
3. Une expression de type
dans le type
fse ,
fse
pas
est un nterface, et
herived
fse.
explicitement driv de
herived
26
herived .
jv fug quoi
provoque le message d'erreur suivant:
jvFlngFerrytoreixeptionX
t fugFspoil@fugFjvX RA
t fugFmin@fugFjvX UA
gCC, ceci correspondrait au fait que si herived drive de fse, herived B
fse B , mais que herived BB n'est pas acceptable
comme fse BB .
En
5.7 Accs
Il faut bien distinguer la visibilit de l'accessibilit, mme si les diagnostics
du compilateur ne le font pas toujours. Si un objet
un membre
elt,
comme
comme
conseille.
Par contre, comme nous l'avons dj dcrit, le niveau de protection d'
la relation entre la classe qui contient le code rfrenant et
interdire l'usage. Dans le code d'une mthode de
ou
glzFelt
glz,
glz
les notations
elt,
elt,
et
peuvent en
thisFelt
dans la mesure
o il n'y a pas de conit avec le nom d'un argument ou d'une variable locale.
Pour viter les ambigits sans alourdir le code, il est conseill de donner aux
attributs, surtout ceux d'instance, un nom reconaissable, comme, dans ce cas,
elt
ou
melt .
27
5.8 Abstraction
Bien que les niveaux de protection procurent une certaine sparation de
l'interface et de l'implmentation, elle n'est pas totale, en particulier le source
d'une classe mlange les deux. Il existe un quivalent pur interface d'une classe,
introduit par le mot-clef
interface est voisine de celle d'une classe, avec quelques importantes dirences:
Un interface peut tre public ou package, mais aucun qualicateur de
protection ne peut tre appliqu ses membres qui sont tous implicitement
publics
Seules les mthodes peuvent tre des membres d'instances, tout membre
attribut est implicitement dclar
finl
{FFF}
implements interface
(en eet elle n'hrite que des dclarations, pas des dnitions qu'elle devra
fournir), et cette clause peut tre multiple, c'est--dire qu'une classe peut
implmenter plusieurs interfaces!
Un interface ne peut bien sr pas hriter d'une classe, pas mme d'
yjet ,
extends .
Cette notion d 'abstrait est galement tendue aux classes: une classe peut tre
dclare
qu'elle dclare (ou dont elle hrite). Les mthodes dclares sans tre implmentes doivent tre elles-mmes prcdes du mot-clef
strt .
Un cas typique
de classe abstraite est une classe qui implmente partiellement un interface. Une
classe abstraite est donc intermdiaire entre un interface et une classe normale, mais une autre classe ne peut ( nouveau) driver que d'une seule classe
abstraite, ce qui limite leur emploi dans une certaine mesure.
On peut dclarer une variable avec pour type une rfrence un interface ou
une classe abstraite, mais on est alors certain qu' l'excution, si cette variable
contient autre chose que la rfrence
null,
jv
28
jv,
try tryBlock
th@ExceptionClass id A handlerBlock
FFF
Le contrle de l'excution sera tranfr au dbut du bloc
ExceptionClass
tryBlock .
handlerBlock
si une
jvFlngFhrowle .
1. La classe
2.
3.
Une mthode peut dclarer les mthodes que son excution peut lever sans
qu'elle les gre elle-mme par la clause:
doit
irror
unimeixeption
ves par de nombreuses constructions du langage, mais dont le dveloppeur peut se garantir par des techniques que le compilateur n'est pas
0),
Exiger que tout programme dclare ou traite ces erreurs nuirait en dnitive
la lisibilit et la maintenabilit du code.
29
Les Composants
java
7.1 Introduction
Au dbut, les seuls composants
7.2 Srialisation
La capacit de sauvegarder l'tat d'un objet et de le restaurer ultrieurement
est intressante en soi. Elle l'est particulirement dans le cas de composants que
des outils visuels permettent de paramtrer sur-mesure, car ce paramtrage
jv
erilizle
certaine mesure de contrle peut tre amene par un nouveau qualicateur pour
les attributs,
trnsient :
writeyjet
et
redyjet .
ixternlizle ,
jvFutil
jvFens
et
jvxFswing .
jvFutilFiventyjet ,
c'est une classe concrte, mais sa seule proprit est sa source. Des objets
de cette classe peuvent tre instantis et transmis, mais ils ne comportent
aucun tat, ne transportent aucune autre information que celle d'avoir t
suscits, et par qui.
2. Les listeners. Il existe un interface
jvFutilFiventvistener ,
mais il
est vide. Pour chaque classe spcique d'vnement, on dnit un interface qui tend
iventvistener ,
jvFwtFeventFetionivent .
tiongommnd
de l'etionivent .
yjet3
connatre certains types d'vnements , donc les types de listener correspondants et doit dnir des mthodes X
ddiventvistener@xiventvistener listenerAY
et
removeiventvistener@xiventvistener listenerAY
rien n'interdit un objet de, ni ne le force , tre simultanment source
et listener. Des sources typiques sont:
des composants graphiques classiques, dans
Par exemple les boutons sont des sources de
des javabeans
31
jvYwt ou jvxFswing .
etionivent .
jv
peut
menter soit
package
classe
nme
de type
type
s'il
type getxme@AY
void setxme@type vlueAY
S'il possde ces deux mthodes, la proprit est accessible en lecture/criture, si seule la mthode
get
isxme@A
iventxme
s'il possde
Les deux peuvent se combiner: deux vnements lis aux proprits sont prdnis:
ropertyghnge
et
etoleghnge . Le premier
32
ropertyghnge
ddGremove
set.
ropertyghngeupport
Une
jvFens ).
tring !
Mais
vnements gnrs par l'un des mthodes publiques de l'autre, tout cela avec
un pilotage purement visuel du dveloppeur.
Programmation
java
avance
8.1 Introduction
L'un des attraits que possdait
jdk1.0beta ,
HTTP). En par-
jv
33
Un mot-clef particulier,
synhronized ,
soins de synchronisation
jv)
un processus ex-
hred ,
et rednir la mthode
run@A :
new sk@AFstrt@AY
2. Ecrire une classe qui implmente l'interface
thode
run@A :
unnle ,
34
et dnir la m-
hred
run@A
s'excute.
hred
hred .
jv, ce seront des objets qui joueront aussi bien le rle de verrou d'exclusion
jvFutilFetor .
elements , soit visible par
classe
etor ,
disons
dirents:
1. code excut par le 1er
hred :
yjet eltanullY
if @elementsFsize@AbHA
eltaelementsFelementet@HAY
2. code excut par le 2me
hred :
if @elementsFsize@AbHA
elementsFremoveet@HAY
En l'absence de toute synchronization, l'ordonnancement des instructions entre
les deux threads est libre. Dans le cas o les deux threads arrivent au dbut
des sections de code alors que
deux appels
size@A
elements
contient exactement
35
un
lment, les
removeilementet
peut
synhronized
hred :
yjet eltanullY
synhronized@elementsA {
if @elementsFsize@AbHA
eltaelementsFelementet@HAY}
2. code excut par le 2me
hred :
synhronized@elementsA {
if @elementsFsize@AbHA
elementsFremoveet@HAY}
L'eet de
synhronized
elements
pour
la dure du bloc entre accolades. Maintenant les deux threads ne pourront pas
pntrer en mme temps dans les sections synchroniss, le deuxime arriv devra
attendre que le premier en soit sorti.
Ceci est l'usage le plus gnral de synchronized, mais l'usage le plus frquent
est en fait un cas particulier, o
synhronized
d'une mthode. Si la mthode est une mthode d'instance, ceci est quivalent
encadrer le code par la mthode par
synhronised@thisA{FFF} .
Deux m-
synhronized
hred peut acqurir plusieus fois le mme verrou. Une mthode synhronized
peut donc en appeler une autre, sans provoquer de deadlock, le verrou ne sera
relch qu'aprs la terminaison du bloc
les blocs
synhronized
synhronized
ment.
Pour des raisons analogues celles rencontres dans l'exemple prcdent, la
plupart des mthodes d'instance de
golletion
dfaut.
D'autre part l'accs a des attributs individuels d'un objet peut tre garanti
des problmes de synchronisation moindre cot, grce aux deux points suivante:
L'accs une variable individuelle est atomique, c'est--dire que, par
exemple, un
hred
36
short
non synchronise ne risque pas de recevoir un monstre dont 8 bits contiendraient ce qu'il y avait mis son dernier accs, et les 8 autres ce qu'un
autre
hred
vient d'y mettre. Attention, ceci n'est pas garanti pour les
doule )!
voltile , chaque
son tat le plus rcent, c'est--dire que toute modication eectue par
hred
un
hred
hred .
wit
peut
hred
actif, et ayant son tour acquis le verrou, invoque sur cet objet la
mthode
en attente sur l'objet pour le ractiver, alors que dans les autres cas tous les
threads concerns le sont. Mme si le
hred
hred
ayant invoqu
notify
hredht
putlue .
getlue ,
le
La synchronisation
37
hred d'ac-
38
vok
ci-dessous
39
jvFnet
contiennent principalement:
40
un objet
snputtrem
et d'un
yutputtrem ,
respectivement
pour lire ou crire dans le socket. Dans notre exemple, de faon pouvoir servir
argument la porte sur laquelle le socket est l'coute. La mthode accept est
bloquante jusqu' la connexion d'un nouveau client, elle retourne un nouveau
socket ouvert avec le client, ce socket est transmis au constructeur du
service qui cre un
fufferededer
et un
import jvFioFBY
import jvFnetFBY
41
rintriter ,
hred
de
respectivement pour
42
getfyxme
serveur, le client cre des stream pour lire et crire dans le socket.
import jvFioFBY
import jvFnetFBY
43
htgrmoket
htgrmket
snetedress ) et de la porte de destination. On peut ensuite transmettre le message par la mthode send sur un htgrmoket . Cot rception, on construit
galement un htgrmket que l'on fournit comme argument la mthode
reeive sur un htgrmoket .
Le serveur d'cho en mode datagramme:
import jvFioFBY
import jvFnetFBY
puli lss htgrmihoerver {
puli stti void min@tring rgsA {
int portaHY
try {
port a sntegerFprsesnt@rgsHAY
}
th @ixeption eA {
ystemFoutFprintln@4sgeX ihoerver port4AY
ystemFexit@IAY
}
try {
htgrmoket soket a new htgrmoket@portAY
yte uffer a new yteIHHHY
htgrmket inpketa new htgrmket@
ufferD ufferFlengthAY
while@trueA {
soketFreeive@inpketAY
ystemFoutFprintln@4wessge from 4 C
inpketFgeteddress@AFgetrostx
45
inpketFgeteddress@AD inpketFgetort@AAY
soketFsend@outpketAY
inpketFsetvength@ufferFlengthAY
}
}
th@syixeption eA {
ystemFoutFprintln@eAY
}
}
}
Le client en mode datagramme:
import jvFioFBY
import jvFnetFBY
46
47
La scurit
jv responsable de trouver
jv
jv
jv reprsentes en
jvFlngFglss ). Toute classe
contient une rfrence au chargeur de classe qui l'a charg, et donc qui l'a
instanti. Quand une rfrence symbolique sur une classe est rencontre
dans du code appartenant une classe dj prsente, la procdure suivante
est observe pour la rsoudre:
(a) On cherche dans la table ci-dessus s'il existe une entre dont la clef
est la combinaison du nom constituant la rfrence symbolique et du
chargeur de la classe courante. Si c'est le cas, la classe correspondante
est utilise
a deux consquences:
i. Le chargeur de classe ne peut pas pervertir le systme en rsolvant diremment une mme rfrence symbolique en deux
occasions.
ii. Si une classe ayant le mme nom est dj prsente mais associe
un autre chargeur, elle ne sera pas forcment utilise dans ce
contexte. Ceci vite qu'une classe charge par exemple par un applet malveillant et possdant le mme nom qu'une classe systme
non encore charge soit trouve et appele par du code sain.
(b) Si la classe n'a pas t trouve en (a), alors la mthode
lodglss
est invoque sur le chargeur de la classe courante. Quand cette mthode retourne avec succs, le rsultat est utilis pour crer une nouvelle entre dans la table, avec le nom de la classe, et ce chargeur.
Ceci n'implique pas nanmoins que ce chargeur soit celui associ; la
classe, car rien un chargeur peut demander un autre chargeur de
cooprer avec lui pour trouver une classe, si la politique de scurit
ne s'y oppose pas.
48
jv mais
plutt partie intgrante de la machine virtuelle), qui est utilis pour charger les classes locales, et en particulier les classes des packages de base.
Plus tard d'autres chargeurs de classe pourront tre instantis applicativement, en particulier pour aller chercher des classes sur le rseau. Un
chargeur dirent est cr pour chaque serveur source de classes. La methode
lodglss
tring .
godeoure
et un ensemble de permissions. Un
godeoure
re-
prsente l'origine d'une classe, en un sens similaire, mais plus riche que
celui utilis par les chargeurs de classes, puisqu'il combine URL originateur
et (ventuel) certicat de scurit. Les permissions couvrent tous les domaines sensibles de l'activit d'une application, comme l'accs aux chiers,
l'accs au rseau, l'ouverture de fentres, etc... La politique de scurit est
un nouveau mcanisme du jdk1.2, qui permet un contrle plus n de la
scurit, sans avoir besoin de le programmer, car une politique peut tre
spcie par un chier texte, lui-mme aisment congurable par un outil
spcialis,
poliytool .
godeoure .
machine virtuelle depuis la ligne de commande, il n'y a pas de gestionnaire de scurit global tant que le code applicatif n'en installe pas un,
ce qui fait que la politique de scurit n'est pas applique! Bien sr, un
browser en installe un. Jusqu'au jdk1.1, c'tait une classe abstraite qu'il
tait ncessaire d'implmenter, mais avec l'introduction de la politique de
scurit, la classe de base est parfaitement utilisable telle quelle.
6. Nous avons mentionn les certicats de scurit en 5. Ils annoncent les
mcanismes extrieurs de la scurit, avec les archives et les cabinets,
pour empaqueter ensemble classes et certicats, la cryptographie, pour
garantir la valeur du rsultat, les couches scurises de transport, etc...
49
hred
hred ,
cette exi-
client
(b) Du code autoris peut explicitement demander rlaxer cette exigence vis--vis de ses appelants.
50