Professional Documents
Culture Documents
Laboratorul 14
Laboratorul 14
14.1. !"#$%&'($%)*(+)"',-.
27',# !)*$0'5!'// E$'-uri destul de bune pentru implementarea logging-ului: log4j 6$!
0'#&-#1-, !-)! /<<$&<!/.)1$'!-)!9#B#!$&7 ,0!%&!9FG=!H/',6$!15"(&)!&)7)0#15!071$)1)#!-)!
$&0'1,78$,&$!+1$&!7#1)!0)!.#7!#+) ,1$!75'1)!#7)0')!24I-,1$!/1$,&-)!#B)"!&)B/$)!05! /<5"!
#&,"$')!/+)1#8$$=
// Item.java
package shopp;
// ShoppingCart.java
1
Paradigme de Programare
Laboratorul 14
package shopp;
import java.util.*;
// Inventory.java
package shopp;
import java.util.ArrayList;
import java.util.List;
// ShoppingCartOperator.java
package shopp;
2
Paradigme de Programare
Laboratorul 14
sc.removeItem(item);
inventory.addItem(item);
}
}
// Test.java
package shopp;
// Item.java
package shopp;
import java.util.logging.*;
3
Paradigme de Programare
Laboratorul 14
// TraceAspect.aj
package shopp;
import org.aspectj.lang.*;
import java.util.logging.*;
pointcut traceMethods()
: execution(* *.*(..)) && !within(TraceAspect);
before() : traceMethods() {
Signature sig = thisJoinPointStaticPart.getSignature();
_logger.logp(Level.INFO, sig.getDeclaringType().getName(), sig
.getName(), "Entering");
}
}
pointcut traceMethods()
4
Paradigme de Programare
Laboratorul 14
Din punct de vedere al componentelor (clase, module) în care se poate diviza sistemul ce
'1)C,$!$"+ )")&'#'?!-$0'$&<)"!,1"5'/#1) )!J&$B) !"$&$"# K:
5
Paradigme de Programare
Laboratorul 14
package hotel;
package hotel;
A(10),
B(20),
C(30),
D(40);
6
Paradigme de Programare
Laboratorul 14
package hotel;
package hotel;
package hotel;
import java.util.*;
public StaffHandler() {
testInits();
}
7
Paradigme de Programare
Laboratorul 14
return rooms;
}
Pentru implementarea acestora vom folosi aspectele, pentru ca tot codul relativ la fiecare
!,%*-#$%&.)&7$%&.%,-*-/&C"/*-un modul propriu.
package hotel;
8
Paradigme de Programare
Laboratorul 14
package hotel;
9
Paradigme de Programare
Laboratorul 14
package hotel;
10
Paradigme de Programare
Laboratorul 13
Laboratorul 13
13.1. !"#!$%$!&$'"!(&)*$*+'$,-&.*'/01 2
!"#!$%$!&$'"!(&)*$*+'",(&-*'&.*&'%&*"/"0"#($'-&$'%$('/&.'1"0".(*+'0$'%"%&)*20'$-*2$0'3&)*!2'
!&4"05$!&$'3!",0&%&0"!'/&',$4+'6)'(%30&%&)*$!&$'."027((0"!'."1*8$!&9' $!$/(#%$'"!(&)*$*+'
",(&-*'&.*&'1"0".(*+'-2'.2--&.'6)'-$420'(%30&%&)*+!(('%"/20&0"!'/&',$4+:'*"*2;(')2'"1&!+'."027(('
3!&$'!&2;(*&'6)'-$420'3!",0&%&0"!'-"%2)&'%$('%20*"!'%"/20&9' !"#!$%$!&$'"!(&)*$*+'
aspect (AOP<'&.*&'"')"2+'%&*"/"0"#(&'-$!&'"1&!+'.&3$!$!&$'3!",0&%&0"!'-"%2)e diferitelor
%"/20&9' &)*!2'$-&$.*$'.&'()*!"/2-&'"')"2+'2)(*$*&'/&'%"/20$!(4$!&='aspectul: o entitate ce
()*&!5()&'6)'%"/20&0&'/&',$4+'/$!'&.*&'*"*2;('(%30&%&)*$*+'.&3$!$*:'-$'2)'%"/20'/(.*()-*9'
!",0&%&0&'-"%2)&'%$('%20*"!'%"/20&'/&',$4+'>crosscutting concerns) sunt implementate
$.*1&0'6)'$.3&-*&:'6)'0"-'.+'1(&'().&!$*&'6)'1(&-$!&'%"/209' !()*!-un proces numit weaving
-"%,()+'%"/20&0&'/&',$4+'6%3!&2)+'-2'$.3&-*&0&'",7()?)/2-se astfel sistemul final.
Printre aspectele periferice tipice 6)'$30(-$7iile software mai complexe sunt: autentificare,
0"##()#:'$--&.20'0$'!&.2!.&:'&0&%&)*&'/&'3&!1"!%$)7+:'$/%()(.*!$!&:'%$)$#&%&)*20';('
3&!.(.*&)7$'/$*&0"!:'()*&#!(*$*&$'*!$)4$-7((0"!:'*!$*$!&$'&!"!(0"!9'G)'1(#2!+'32*&7('",.&!5$'-2%'"'
$30(-$7(&'3"$*&'1('.&3$!$*+'6)'$.3&-*&';('-2%'-20"!(0&'/()'%"/20&0&'/&'(%30&%&)*$!&'()/(-+'
6)*!&3+*!2)/&!&$'$-&.*"!'$.-3&*&9
1
Paradigme de Programare
Laboratorul 13
B+'$)$0(4+%'/&'&C&%302'"'(%30&%&)*$!&'6)'.*(020'HH '$'2)2('%"/20'/&'$2*"!(4$!&'6)*!-"'$30(-$7(e.
D-&.*'%"/20:'3&)*!2'$')2'1('3!&$'.*!?).'0&#$*'/&'%"/20&0&'-&'60'5"!'1"0".('6;('5$'"1&!(('.&!5(-((0&'3!()'
()*&!%&/(20'2)&('()*&!1&7&9'A&420*+'-+'"'(%30&%&)*$!&'$'2)&('$.*1&0'/&'()*&!1&7&'3"$*&'1('2;"!'6)0"-2(*+'
-2'"'$0*+'(%30&%&)*$!&:')&1(()/')&-&.$!&'%"/(1(-+!('/&'-"/'6)'%"/20&0&'-0(&)*9'I"*2;(:'$-&$.*+'
-")1(#2!$!&')&-&.(*+'-$'1(&-$!&'-0(&)*'-&'5$'1"0".('%"/2020'.+'6)-"!3"!&4&'$3&02!('-+*!&'D J-ul oferit de
acesta. Aceste apeluri legate de autorizare, nespecifice celorlalte module, vor fi mixate în codul de
0"#(-+'.3&-(1(-'$-&.*"!$:'$0+*2!('3!",$,(0'/&'$0*&'$3&02!('-+*!&'$0*&'%"/20&'3&!(1&!(-&9'G)'1(#2!+'.&'
",.&!5+'-2%'2)'%"/20'3&!(1&!(-'/&5()&'.*!?).'0&#$*&'/&'-&0&0$0*&'%"/20&=
2
Paradigme de Programare
Laboratorul 13
D(-('&.*&'32)-*20'2)/&'#?)/(!&$'"!(&)*$*+'$.3&-*'6;('$!$*+'$5$*$@&0&9'K(-('2)'%"/20'/&',$4+')2'
*!&,2(&'.+'6;('1$-+'#!(@('/&'$.3&-*&'3&!(1&!(-&'3!&-2%'-&0'/&'$2*"!(4$!&'.$2'0"##()#='2)'$.3&-*'
se va ocupa de acestea prin inserarea apelurilor API în punctele potrivite:
!"#!$%$!&$'"!(&)*$*+'$.3&-*'"1&!+'"'.&!ie de beneficii:
!&.3").$,(0(*+7('%$('-0$!&'$*$;$*&'1(&-+!2('%"/20'6)'3$!*&
%"/20$!(4$!&'%$('32*&!)(-+:'&0(%()?)/2-.&'0&#$!&$'&C-&.(5+'6)*!&'%"/20&
&5"027(&';('&C*()/&!&'%$('2;"$!+'$'."027(&(:'1(&-$!&'$.3&-*'32*?)/'1('*!$*$*'.&3$!$*
reutilizarea codul este %$('1$-(0+
)"('12)-7(")$0(*+7('3"*'1('$/+2#$*&'%20*'%$('2;"!';('%$('!$3(/:'($!'%"/20&0&'/&@$'-!&$*&')2'
.2)*'$1&-*$*&'/&')"(0&'%"/(1(-+!(:'3&)*!2'$'32*&$'1('$0*&!$*&
13.2. AspectJ
DH '&.*&'/"$!'"'%&*"/"0"#(&9' &)*!2'$'32*&$'1('1"0".(*+'6)'3!"#!$%$!&$'!&$0+'&$'*!&,2(&'(%30&%&)*$*+:'
($!'1$-(0(*+7(0&'&('*!&,2(&'"1&!(*&'3!()'()*&!%&/(20'2)2('0(%,$@'/&'3!"#!$%$!&')"2'.$2'2)20'/&@$'existent
dar adaptat. Un astfel de limbaj este AspectJ.
D.3&-*L'&.*&'"'&C*&).(&'"!(&)*$*+'3&'$.3&-*'$'0(%,$@202('/&'3!"#!$%$!&'L$5$9'M(()/'"'&C*&).(&:'!&420*+'
-+'"!(-&'3!"#!$%'L$5$'5$0(/'&.*&';('2)'3!"#!$%'D.3&-*L'5$0(/9'N"%3(0$*"!20'D.3&-*L'3!"/2-&'1(;(&!e
-0$..'-")1"!%&'-2'.3&-(1(-$7((0&'L$5$'byte-code9'J%30&%&)*$!&$'D.3&-*L'"1&!+'*""0-uri pentru
-"%3(0$!&:'/&,2##()#';('()*&#!$!&'6)'-&0&'%$('3"320$!&'JFO-uri Java.
3
Paradigme de Programare
Laboratorul 13
dinamic='-&0'%$('/&.'1"0".(*:'%"/(1(-+'1(!20'&C&-27(&('3!"#!$%202(
static='3!"/2-&!&$'2)"!'%"/(1(-+!('6)'.*!2-*2!$'.*$*(-+'$'.(.*&%202(='-0$.&:'$.3&-*&:'()*&!1&7&9
// SampleAspect.aj
package test;
before() : messageSending() {
System.out.println("a message is about to be send");
}
J&;(!&$'6)'2!%$'!20+!(('$-&.*2('3!"#!$%'&.*&=
”Join Point” este conceptul fundamental în AspcetJ. Un join point este orice punct identificabil în
&C&-27($'2)2('-"/='$3&020'2)&('%&*"/&:'&C&-27($'2)&('%&*"/&:'$.(#)$!&$'2)&('5$0"!('-+*!&'"'5$!($,(0+:'
-").*!2-7($'2)2('",(&-*'.$2'-P($!'"',2-0+'1"!'.$2'8P(0&9' 2)-*&0&'/&'@"()'.2)*'0"-2!('6)'-$!&'2)'$.3&-*'
3"$*&'()*&!5&)('3&)*!2'$'%"/(1(-$'-2!.20'()(7($0'$0'&C&-27(&(9
4
Paradigme de Programare
Laboratorul 13
&C&-2*(")'@"()'3"()*='-P($!'&C&-27($'-"!3202('2)&('%&*"/&
-$00'@"()'3"()*='32)-*20'2)/&'"'%&*"/+'&.*&'$3&0$*+
D.&%&)&$'%&*"/&0"!:'/&-?*'-+'1$-'!&1&!(!&'0$'().*$)7(&!(0&'2)"!'",(&-*&';(')2'0$'$3&02!('/&'%&*"/&9
AspectJ expune doar accesul la variabilele care sunt membre ale claselor sau ale aspectelor. Aceste
puncte de join su)*'/&'/"2+'*(32!(='!&$/'$--&..';('8!(*&'$--&..9
A&3!&4()*+'&C&-27($',0"-2!(0"!'-$*-P'$*2)-('-?)/'"'&C-&37(&'&.*&'#&)&!$*+9
A&3!&4()*+'6)-+!-$!&$'2)&('-0$.&:'()-02.(5'$'3"!7(2)(0"!'/&'-"/'.*$*(-&9'F$-+'.2)*'%$('%20*&'3"!7(2)('
.*$*(-&'/&'()(7($0(4$!&:'*"$*&'5"!'1('()-02.&'6)'$-&0$;('@"()'3"()*9'NP($!';('/$-+')2'&C(.*+')(-('2)',0"-'
.*$*(-'/&'()(7($0(4$!&:'@"()'3"()*-ul tot va fi prezent.
J)(7($0(4$!&$'2)2('",(&-*'6)-&3&'/&'0$'6)*"$!-&!&$'/()'$3&020'2)2('-").*!2-*"!'/()'-0$.$'/&',$4+';('.&'
6)-P&(&';('3?)+'0$'.1?!;(*20'&C&-27(&('3!(%202('-").*!2-*"!'$3&0$*9'D.*1&0'/&'32)-*&'/&'@"()'.2)*'2*(0&'
$*2)-('-?)/'.&'/"!&;*&'$/+2#$!&$'/&'()(7($0(4+!('suplimentare la crearea unor obiecte.
5
Paradigme de Programare
Laboratorul 13
// SavingsAccount.java
package test;
// JoinPointTraceAspect.aj
package test;
before() : tracePoints() {
_callDepth++;
print("Before", thisJoinPoint);
}
after() : tracePoints() {
print("After", thisJoinPoint);
_callDepth--;
}
6
Paradigme de Programare
Laboratorul 13
13.2.3. Aspects
F&-0$!$7($'2)2('$.3&-*'.&$%+)+'1"$!*&'%20*'-2'-&$'$'2)&('-0$.&=
$.3&-*&0&'3"*'()-02/&'5$!($,(0&'%&%,!&';('%&*"/&
se pot aplica modificatorii de acces
aspectele pot fi declarate ca fiind abstracte
3"*'&C*()/&'-0$.&:'$.3&-*&'$,.*!$-*&:'.$2'(%30&%&)*$'()*&!1&7&
)2'3"*'1('().*$)7($*&'6)'%"/'/(!&-*
Elementele pointcut pot fi anonime sau cu nume. Cele anonime sunt folosite pe loc atunci când se
definesc reguli pentru punctele de join sau pot fi folosite la definirea altor elemente pointcut. Cele cu
)2%&'3"*'1('!&1&!(*&'/()'%20*(30&'0"-$7((:'1(()/'$.*1&0'!&2*(0(4$,(0&9
Q'"!(-&')2%+!'/&'-$!$-*&!&'%$('327()'32)-*
99'"!(-&')2%+!'/&'-$!$-*&!&:'()-02.(5'"!(-&')2%+!'/&'32)-*&
R'"!(-&'.2,-0$.+'.$2'.2,()*&!1$7+'$'2)2('*(3'/$*
"*'1('/&'$.&%&)&$'1"0".(7(';('"3&!$*"!('0"#(-(=
S>)&#$!&<'.3&-(1(-+'*"$*&'32)-*&0&'/&'@"()'%$('327()'-&0&'.3&-(1(-$*&'/&'&0&%&)*20'3"()*-2*'
precizat, ex: !within(JoinPointTraceAspect)
TT';('UU'"3&!$*"!('0"#(-('1"0".(7('6)'-"%,()$!&$'%$i multor elemente pointcut.
!&-&/&)7$'"3&!$*"!(0"!'&.*&'$-&&$;('-$'-&$'/()'L$5$9
7
Paradigme de Programare
Laboratorul 13
F23+'-$*&#"!((0&'32)-*&0"!'/&'@"()'3&'$!&'0&-$%'5+42*'$)*&!("!'$5&%'2!%+*"$!&0&'&0&%&)*&'3"()*-2*=
cflow(Pointcut) (/&)*(1(-+'*"$*&'32)-*&0&'/&'@"()'/()'&C&-27($'32)-*&0"!'/&'@"()'
identificate de elementul pointcut specificat, inclusiv punctele de join identificate de
acesta
cflowbelow(Poincut) 0$'1&0:'/"$!'-+'&C-02/&'32)-*&0&'/&'@"()'(/&)*(1(-$*&'/&'&0&%&)*20'
pointcut specificat
O0&%&)*&'3"()*-2*',$4$*&'3&'.*!2-*2!$'0&C(-$0+=
within(Type) (/&)*(1(-+'*"$*&'32)-*&0&'/&'@"()'/()',0"-20'*(3202('.3&-(1(-$*';('/()'
tipurile imbricate în acesta
withincode(Method or Constructor) toate punctele de join din cadrul codului
metodei/constructorului inclusiv eventualele clase locale
8
Paradigme de Programare
Laboratorul 13
13.3.2. Advice
E)'$/5(-&'!&3!&4()*+'$-7(2)&$'-&'*!&,2(&'02$*+'$*2)-('-?)/'2)'&0&%&)*'3"()*-2*'(/&)*(1(-+'2)'32)-*'/&'
@"()9'D-&$.*+'$-7(2)&'3"$*&'$5&$'0"-'6)'V'%"%&)*&'/(1&!(*&'!&0$*(5'0$'%"%&)*20'&C&-27(&('32)-*202('/&'
join: before, after sau around.
Before advice
!"#$%&'(')"(*+#(,-'&-."(/"("!"#$%&'(0$-#.$*$&(/"(1+&-(&/"-.&2&#'.3(4'#5(+("!#"0%&"("6."(7"-")'.5(,-(
corpul advice atunci punctul de join capturat nu se va mai executa.
After advice
8+*+6&-/('#"'6.5(2+)95:(#+/$*('/;&#"(6"(;'("!"#$.'(/$05(0$-#.$*(/"(1+&-:(&-/&2")"-.(/'#5("!"#$%&'(
acestuia s-'(.")9&-'.(-+)9'*(6'$(+("!#"0%&"('(2+6.(7"-")'.53
Around advice
@+/$*('/;&#"(,-#+-1+')5(,-('#"6.(#'<("!"#$%&'(0$-#.$*$&(/"(1+&-(&/"-.&2&#'.:(0$.A-/("*&9&-'("!"#$%&'(
'#"6.$&'(#+90*".:('/5$7'(#+/(6$0*&9"-.'):(6'$(#B&')(65("xecute punctul de join de mai multe ori.
C"-.)$('("!"#$.'(#+/$*(&-&%&'*('*(0$-#.$*$&(/"(1+&-(6"(2+*+6"=."('0"*$*(proceed(). „Metoda” advice
.)"D$&"(65()".$)-"<"('#"*'=&(.&0(#'(=&(0$-#.$*(/"(1+&-(#'0.$)'.3(4'#5('/;&#"-$*('(#+*"#.'.(-&=."(0')'9".)&(
atunci me.+/"(0)+#""/EF(.)"D$&"(65(0)&9"'6#5('#"*'=&(-$95)(/"(0')'9".)&(=&(/"('#"*'=&(.&0>
9
Paradigme de Programare
Laboratorul 13
import java.rmi.RemoteException;
// RemoteClient.java
package test;
// FailureHandlingAspect.aj
package test;
import java.rmi.RemoteException;
10
Paradigme de Programare
Laboratorul 13
// OptimizeFactorialAspect.aj
package test;
import java.util.*;
pointcut topLevelFactorialOperation(int n) :
factorialOperation(n)
&& !cflowbelow(factorialOperation(int));
before(int n) : topLevelFactorialOperation(n) {
System.out.println("Seeking factorial for " + n);
}
13.4. Bibliografie
11
Paradigme de Programare
Laboratorul 12
Laboratorul 12
12.1. !"#$!%&'($)*$+,!)&%,!#&
!"#$!%&#&'($)*$+,!)&%,!#&'-&'$(.*/'(.'!#0$+1,)1'21'(.'!,+1".1+&!'+&-*$%-!"1#1,/31#$+'4%,+&'$"1&(,&5'6&'
#7%0/'2!"#$!%&#&'8&'$"1&(,&'-!.'8&'(#!-&9'!(&-,&!'8&-(+1.'21'2!"#$!%&#&'8&'($).%1(!+&'4%,+&'
(#!-&:$"1&(,&5';(&-,&'2!"#$!%&'!<.,/'#!'($%(&%,+!+&!')!1').#,'!-.*+!')$8.#.1'4%'(!+&'-.%,'
1%,&+($%&(,!,&'$"1&(,&#&'21')!1'*.31%'!-.*+!'=#.>.#.1'($)*#&>'8&'($%,+$#'81=1(1#'8&'.+)/+1,'#!'&>&(.31&5
12.1.1. -".&+/&+
1) !"#$#%#!
L&'8&=1%&2,&'$'8&*&%8&%3/'M.%.'#!').#31M'4%,+&'$"1&(,&9'!-,=&#'4%(7,'8!(/'.%'$"1&(,'421')$81=1(/'-,!+&!9'
,$!,&'$"1&(,&#&'8&*&%8&%,&'8&'!(&-,!'E$+'=1'%$,1=1(!,&5' !"#$%.#')!1'&-,&'(.%$-(.,'21'-."'%.)&#&'8&'
Publish Subscribe -!.'Dependenti5
2) &'(#)*+#(#,*,!-.#-+!$!"#)##
;(&-,'2!"#$%'*&+)1,&'E!+1!31!'1%8&*&%8&%,/'!'$"-&+E!,$+1#$+'21'!'$"1&(,&#$+'$"-&+E!,&5'L&'*$,'+&.,1#1D!'
.%&#&'81%,+&'&#&9'=/+/'!'#&'+&=$#$-1'*&'(&#&#!#,&5'L&'*$!,&'8&'!-&)&%&!'!8/.0!'$"-&+E!,$+1'=/+/'!'
)$81=1(!'$"1&(,&#&'$"-&+E!,&'-!.'(&1#!#31'$"-&+E!,$+15
()* "&!"%+$,#'
- (7%8'!"-,+!(,1D!+&!'!+&'8$./'!-*&(,&9'.%.#'8&*1%D7%8'8&'(&#/#!#,5'N%(!*-.#!+&!'4%'
$"1&(,&'-&*!+!,&'*&+)1,&'E!+1!31!'#$+'4%')$8'1%8&*&%8&%,5
- (7%8')$81=1(!+&!'.%.1'$"1&(,'%&(&-1,/'21 )$81=1(!+&!'!#,$+'$"1&(,&9'=/+/'!'2,1'(!+&'&-,&'
%.)/+.#'!(&-,$+!5
- (7%8'.%'$"1&(,',+&".1&'-/'%$,1=1(&'!#,&'$"1&(,&'=/+/'-/'%&(&-1,&'(.%$!2,&+&!'18&%,1,/311'
!(&-,$+!'I%.'8$+1)'#&0!+&!'-,+7%-/'4%,+&'!(&-,&!K
Avantaje
1
Paradigme de Programare
Laboratorul 12
- (.*#!+&'!"-,+!(,/'4%,+&'-."1&(,'21 $"-&+E!,$+1@'-."1&(,.#'!+&'$'#1-,/'8&'$"-&+E!,$+1'(!+&'-&'
($%=$+)&!D/'.%&1'1%,&+=&3&'-1)*#&9'(.*#!+&!'=11%8'+&8.-/'#!')1%1)
- ($).%1(!+&'*&'-(!+/'#!+0/@'-."1&(,.#'%.'&-,&'1%,&+&-!,'8&'8&-,1%!,!+11'.%&1'%$,1=(/+19'&#',+1)1,&'
)&-!<.#',.,.+$+'(&#$+'!"$%!31'#!')$)&%,.#'+&-*&(,1E5';(&-,'#.(+.'*&+)1,&'!8/.0!+&!'21'
)1%!+&!'8&'$"-&+E!,$+1'4%'$+1(&')$)&%,'%&(&-!+5
3) Structura
4) /*0,#)#'*$%#
Subject
O&31%&'21'*$!,&'=1'$"-&+E!,'8&')!1').#31'$"-&+E!,$+1P'=.+%1D&!D/'$'1%,&+=!3/'*&%,+.'!,!2!+&!'21'
8&,!2!+&!'!(&-,$+!
Observer
Q&=1%&2,&'1%,&+=!3!'8&'!(,.!#1D!+&'(&',+&".1&'1)*#&)&%,!,/'8&'(/,+&'$"1&(,&#&'(&'8$+&-('
%$,1=1(/+1'8&'#!'L."<&(,
ConcreteSubject
O&31%&'1%=$+)!311#&'(&'+&*+&D1%,/'1%,&+&-'*&%,+.'$"1&(,&#&'$"-&+E!,$+5'J7%8'1'-&')$81=1(/'-,!+&!'
,+1)1,&'%$,1=(/+1'(/,+&'$"-&+E!,$+1
ConcreteObsever
6!-,+&!D/'$'+&=&+1%3/'(/,+&'.%'$"1&(,'L."<&(,9'+&31%&'$'-,!+&'($%-&(E&%,/'(.'(&!'!'-."1&(,.#.1'21'
1)*#&)&%,&!D/'F"-&+E&+'*&%,+.'!-21'*.,&!')&%31%&'!(&!-,/'-,!+&'4%'($%($+8!%3/5
2
Paradigme de Programare
Laboratorul 12
12.2. 01&)*#&
1) 12!3'(4-"5(56#0!-7+6!8!0-.#-Observable
;6H-.#'R!E!'$=&+/'8$./'1%,&+=&3&'*&%,+.'!'.2.+!'1)*#&)&%,!+&!'!(&-,.1'2!"#$%@'Obsever 21'
Observable5'S>&)*#.#'.+)/,$+'!+!,/'(.)'*$,'=1'=$#$-1,&'!(&-,&'1%,&+=&3&5
// MessageBoard.java
package test;
import java.util.Observable;
// Student.java
package test;
import java.util.Observable;
import java.util.Observer;
2) Folosire în GUI
!"#$%.#'F"-&+E&+'&-,&'8&-'=$#$-1,'4%'!*#1(!311#&'(.'1%,&+=!3/'.,1#1D!,$+'0+!=1(/'TGH5'Q&'&>&)*#.'!,.%(1'
(7%8'8!,&'-,!,1-,1(&'-.=&+/')$81=1(/+19')!1').#,&'$"1&(,&'0+!=1(&'E$+',+&".1'!(,.!#1D!,&'($%=$+)'%$1#$+'
E!#$+1@'#1-,&9',!"&#&9'81!0+!)&'25!5
J#!-!'-."<&(,'4%'!(&-,'&>&)*#.'&-,&'$'=&+&!-,+/'4%'(!+&'-&'1%,+$8.(&'.%',&>,9'1!+'(#!-!'$"-&+E&+'&-,&'$'
!#,/'=&+&!-,+/'(&'!=12&!D/',&>,&#&'1%,+$8.-&'4%'*+1)!'=&+&!-,+/5
// InputForm.java
3
Paradigme de Programare
Laboratorul 12
package test;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Observable;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
@SuppressWarnings("serial")
class InputForm extends JFrame {
public InformDisplay inform = new InformDisplay();
// ...
JTextField input = new JTextField(10);
public InputForm() {
JPanel panel = new JPanel();
input.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
inform.notifyObservers();
}
});
panel.add(new JLabel("Enter: "));
panel.add(input);
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
getContentPane().add(panel);
setTitle("Observable form");
setSize(200, 100);
setVisible(true);
}
// DisplayForm.java
package test;
import javax.swing.*;
4
Paradigme de Programare
Laboratorul 12
import java.awt.event.*;
import java.util.*;
@SuppressWarnings("serial")
class DisplayForm extends JFrame {
InputForm inputForm;
Observable obsInput;
JTextField display;
// ...
public DisplayForm() {
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
inputForm = new InputForm();
obsInput = inputForm.getInputInfo();
obsInput.addObserver(new InputFormObserver());
12.3. 2*#3(!43&
;*#1(!31!'.+)/,$!+&'$=&+/'.%'-1-,&)')1%1)!#'8&'$+0!%1D!+&'!',!-U-.+1#$+'81%'(!8+.#'.%&1'
&(C1*&'8&'*+$0+!)!+&5
Q1!0+!)!'GBV'&-,&'.+)/,$!+&!@
5
Paradigme de Programare
Laboratorul 12
6
Paradigme de Programare
Laboratorul 12
G%',!-U'4%'-1%&'&-,&'+&*+&D&%,!,'8&'(#!-!'Task9'(!+&'($%31%&'W'*!+!)&,+1'21'$=&+/'0&,,&+&'21'
-&,,&+&'*&%,+.'!(&2,1!'($%=$+)'81!0+!)&15'F=&+/'8&'!-&)&%&!'$'1)*#&)&%,!+&'!')&,$8&1'
,$L,+1%0@
F*&+!311#&'!-.*+!'#1-,&1'8&',!-U-.+1'(.+&%,&'#!'.%')$)&%,'8!,'E$+'0&%&+!'%12,&'M&E&%1)&%,&M'(&'
E$+'=1'!-(.#,!,&'8&'(/,+&'$"-&+E!,$+15'H)*#&)&%,!+&!'!(,$+.#.1'L."<&(,'&-,&'8!,/'8&'(#!-!'
TaskChangeObservable5';(&!-,!'+&31%&'$'#1-,/'&81,!"1#/'8&'$"-&+E!,$+1'21'=!(&'81-*!,(C-ul
&E&%1)&%,&#$+'(/,+&'!(&2,1'$"-&+E&+15
6!+,&!'0+!=1(/'!'!*#1(!31&1'&-,&'=$+)!,/'81%'W'D$%&9'=1&(!+&'%&(&-1,7%8'!(,.!#1D!+&'!,.%(1'(7%8'
#1-,!'8&',!-U-.+1'-.=&+/')$81=1(/+15'6&%,+.'$')!1'.2$!+/'1)*#&)&%,!+&'-&'+&!#1D&!D/'$'1&+!+C1&'
8&'(#!-&'(&'!+&'#!'"!D/'(#!-!'TaskPanel@
A$!,&'(&#&'W'(#!-&'6!%&#'(!+&'E$+'&>,1%8&'A!-U6!%&#'E$+'1)*#&)&%,!'4%,+-.%'=&#'-!.'!#,.#'
1%,&+=!3!'F"-&+E&+@
interface TaskChangeObserver {
public void taskAdded(Task task);
J.)'%.',$!,&'81%,+&'&#&'!.'%&E$1&'8&',$!,&')&,$8&#&'81%'!(&!-,/'1%,&+=!3/9'E$)'=!(&'21'.%'
X+!**&+'!<.,/,$+'4%'!(&-,'-&%-'I;8!*,&+'*!,,&+%K@
7
Paradigme de Programare
Laboratorul 12
Q!(/'%.',$!,&'*!%&#-.+1#&'E$+'1)*#&)&%,!'1%,&+=!3!'A!-UJC!%0&F"-&+E&+'21'%1(1'%.'*$,'
&>,1%8&'(#!-!';8!*,&+9'!,.%(1',$!,&',+&".1&'-/'$=&+&'.%')$8'.%1=$+)'8&'!'$=&+1'.%'$"1&(,'8&',1*'
F"-&+E&+9'#.(+.'+&!#1D!,'*+1%')&,$8!'getObserver 81%'A!-U6!%'J#!-&#&'(!+&'%.'
1)*#&)&%,&!D/'1%,&+=!3!'E$+'=$#$-1'($)*.%&+&!@'$'1%-,!%3/'*+1E!,/'+&!#1D!,/'*+1%,+-$'(#!-/'
1%,&+%/5
TaskEditorPanel &-,&'D$%!'(!+&'$=&+/'*$-1"1#1,!,&!'8&'!'(+&!'.%',!-U'-!.'8&'!')$81=1(!'
*!+!)&,+11'.%.1',!-U'8&<!'&>1-,&%,5';(&-,'*!%&#'+/-*.%8&'#!'&E&%1)&%,.#'8&'-&#&(,!+&'!'.%.1'
%$.',!-U'21'0&%&+&!D/'&E&%1)&%,&#&'8&'(+&!+&'21')$81=1(!+&'8&',!-U5
package test;
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
@SuppressWarnings("serial")
class TaskEditorPanel extends TaskPanel {
private TaskChangeObserver taskObserver;
8
Paradigme de Programare
Laboratorul 12
@Override
public TaskChangeObserver getObsever() {
return taskObserver;
}
}
package test;
9
Paradigme de Programare
Laboratorul 12
import java.awt.event.ActionEvent;
import javax.swing.JComboBox;
@SuppressWarnings("serial")
class TaskSelectorPanel extends TaskPanel {
private TaskChangeObserver taskObserver;
@Override
public TaskChangeObserver getObsever() {
return taskObserver;
}
}
package test;
import java.awt.BorderLayout;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
@SuppressWarnings("serial")
class TaskHistoryPanel extends TaskPanel implements TaskChangeObserver {
private JTextArea displayRegion;
public TaskHistoryPanel() {
createGui();
}
10
Paradigme de Programare
Laboratorul 12
@Override
public TaskChangeObserver getObsever() {
return this;
}
}
12.4. !"!
12.4.1. T!"# 1
@A&$%,!:$(*".$2*:$*(de la -e2Biu%ea CD3D *-&;!.(8%2E&(6*$(6+.&!(;! !-& !()=-! 5! (-'(*-2+.&!(6!-*1!.!(
$%& ),+-!($%(;! !*-& *(-+=$!2&3(F+6' +.(*2!-&) (;! !-& !(& !=+$!(-'(;$!(5* $*=$.(9$(-'(")*&'(;$(2)%& ).*&(8%(
&$6"+.( +.' $$3(G!(!A!6".+(+%(=+&)%(8%(;! !*-& *(,$-".*H("! 6$&!($%-&*%:$! !*(+%+$(%)+()=-! 5! 7($* (
$%2I$,! !*(+%!$(;! !-& !()=-! 5! (%+(6*$(,+2!(.*(8%2I$,! !*(8%& !/$$(*".2$*:$$3
12.4.2. T!"# 2
J)%-& +$:$(2.*-!.!(9$($%&! ;!:!.!(2)%;) 6(,$*/ *6!$(9$(!A".$2*:$$.) (de la -e2Biu%ea CD3K 9$(
!*.$#*:$(;! !*-& *(/ *;$2'(2* !(-'(2+" $%,'(2!.!(K("*%!.-+ $3
@A&$%,!:$(*".$2*:$*(*-&;!.(8%2E&(-'(-!(")*&!(9&! /!(&*-0-+ $.!(-!.!2&*&!3
11
Paradigme de Programare
Laboratorul 11
Laboratorul 11
11.1. !"#$!%&'()*+,)+*!#&
!"#$!%&#&'()*+,)+*!#&'(&'$,+-.'/&'0$/+#'1%',!*&'(+%)',$0-+(&',#!(&#&'23'$"3&,)&#&'-&%)*+'!'4$*0!'
structuri mai complexe.
11.1.1. Adapter
- 2!"#$%'()*+,)+*!#'/&',#!(.'(!+'/&'$"3&,)
1) !"#$#%#!
>*!%(4$*0.'3%)&*4!5!'+%&3',#!(&'1%)*-$'!#).'3%)&*4!5.',+'(,$-+#'/&'!'+2+*!',$0-!)3"3#3)!)&!'23'*&+)3#39!*&!'
unor clase diferite dintr-$'!-#3,!53&7
!"#$%+#'0!3'&()&',+%$(,+)'23'(+"'%+0&#&'/&'Wrapper.
2) &'(#)*+#(#,*,!-.#-+!$!"#)##
?$%,&-)+#'+%+3'!/!-)$*'&()&'(30-#+@',*&.0'$',#!(.',!*&'!*&'3%)&*4!5!'/$*3).:'3!*'!-$3'4!,&0'!,&!',#!(.'
(.',$0+%3,&',+'$',#!(.',!*&'!*&'$'3%)&*4!5.'/34&*3).7
,-. "&!"%($/#'
- A&'/$*&2)&'+)3#39!*&!'+%&3',#!(&'&63()&%)&:'/!*'!',.*&3'3%)&*4!5.'%+',$*&(-+%/&',+',&!'/$*3).
Avantaje
- B',#!(.'8/!-)&*'-$!)&'*&/&43%3'-!*53!#',$0-$*)!*&!',#!(&3'8/!-)&/'C433%/'$'(+",#!(.'!'
acesteia).
- ;%'$"3&,)'8/!-)&*'-&*03)&'+%&3'(3%D+*&',#!(&'8/!-)&*'(.'#+,*&9&',+'0!3'0+#)&',#!(&'8dapted
23'-$!)&'!/.+D!'4+%,53$%!#3)!)&'#!'!,&()&!7
B',#!(.'8/!)&*'!/!-)&!9.'$',#!(.',$%,*&).'8/!-)&/'23'-*3%'+*0!*&'%+'<!'4+%,53$%!'!)+%,3',=%/'(&'
/$*&2)&'!/!-)!*&!'+%&3',#!(&',+')$!)&'(+",#!(&#&'(!#&7'E%',!9+#'$"3&,)&#$*'8/!-)&*'/&<3%&'/343,3#.'
1
Paradigme de Programare
Laboratorul 11
redefinir&!',$0-$*)!0&%)+#+3',#!(&3'8/!-)&/:'-&%)*+'!,&!()!'433%/'%&,&(!*.',*&!*&!'/&'(+",#!(&'
Adapted iar Adapter-+#'(.')*303).',&*&*3#&'/&'#!'?#3&%)',.)*&'!,&()&!7
3) Structura
!"#$%'/&',#!(.
!"#$%'/&'$"3&,)
4) /*0,#)#'*$%#
Target
A-&,343,.'3%)&*4!5!'%&,&(!*.:',!*&'<!'43'+)3#39!).'/&'?#3&%)
Client
2
Paradigme de Programare
Laboratorul 11
?$0+%3,.',+'$"3&,)&'!/!-)!)&'4$#$(3%/+-(&'/&'3%)&*4!5!'/!).'/&'>!*D&)
Adapted
F%)&*4!5.'&63()&%).',&'%&,&(3).'!/!-)!).'-&%)*+'!'-+)&!'43'4$#$(3).'/&',.)*&'?#3&%)
Adapter
8/!-)&!9.'3%)&*4!5!'8/!-)&/'#!',&!'/$*3).:'(-&,343,!).'/&'>!*D&)
?#3&%533'#+,*&!9.',+'3%()!%5&'8/!-)&*:',!*&'#!'*=%/+#'#$*'!-&#&!9.'/3%'8/!-&/'$-&*!533#&'
,$*&(-+%9.)$!*&',&*&*3#$*'<&%3)&'/&'#!'?#3&%)7
11.2. Exemple
11.2.1. Exemplu de Adapter în Java API
I&'&6&0-#+'3%)&*4!5!'G3%/$HJ3()&%&*'!*&'K'0&)$/&7'B*3,=%/'!<&0'%&<$3&',!'$',#!(.'(.'30-#&0&%)&9&'
$'!()4&#'/&'3%)&*4!5.')*&"+3&'(.'30-#&0&%).0')$!)&'0&)$/&#&'/&23'/&',&#&'0!3'0+#)&'$*3'!<&0'%&<$3&'/&'
/$!*'+%!'(!+'/$+.'/3%)*&'!,&()&!7'E%'(,L30":'/!,.'1%'#$,'(.'30-#&0&%).0'3%)&*4!5!'G3%/$HJ3()&%&*'
extindem clasa WindowAdapter, putem implementa doar acele metode care ne sunt utile.
F!).'3%)&*4!5!'+)3#.'CAdaptedM'23',#!(!',&'$'30-#&0&%)&!9.'CAdapter):
import javax.swing.*;
import java.awt.event.*;
3
Paradigme de Programare
Laboratorul 11
public Test () {
setSize(200,200);
setVisible(true);
addWindowListener(new Closer());
}
public static void main(String[] args) {
new Test();
}
class Closer extends WindowAdapter {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}
}
11.2.2. -.&/0#+'&.)1%2&*&'!0#1,!31&
Pattern-+#'8/!-)&*'-$!)&'43'4$#$(3)'!)+%,3',=%/'<*&0'(.'*&4$#$(30',#!(&#&'<&,L3:'4.,=%/',#!(&#&'%$3'
compatibile cu acestea.
I&'&6&0-#+'!<&0'+%'(3()&0'4+%,53$%!#'23')&()!)'*&-*&9&%)!)'D&%&*3,'-*3%'3%)&*4!5!'?#&!%'23',#!(&#&'
/&*3<!)&'/3%'!,&!()!7'N&%)*+'!'!/.+D!'$'4+%,53$%!#3)!)&'%$+.'<$0',*&!'3%)&*4!5!'O6)*!',!*&'&6)3%/&'
3%)&*4!5!'3%353!#.'?#&!%'23'<$0'30-#&0&%)!'%$+!'3%)&*4!5.7
interface Clean {
public void makeClean();
}
class Test {
static void Jobs (Extra job) {
if (job instanceof Clean)
((Clean)job).makeClean();
if (job instanceof Extra)
4
Paradigme de Programare
Laboratorul 11
((Extra)job).takeCare();
}
public static void main(String[] args) {
Extra e = new Facility();
Jobs(e);
Clean c1 = new Office();
Clean c2 = new Workshop();
c1.makeClean();
c2.makeClean();
e.makeClean();
}
}
A-*&'&6&0-#+'!<&0',#!(!'I!)!',!*&'!'4$()',$%,&-+).'23'"3%&')&()!).'!%)&*3$*7'N&%)*+'!'4$#$(3'!,&!().'
,#!(.'1%)*-+%'(3()&0'%$+'23'-&%)*+'!'&6)3%/&'4+%,53$%!#3)!)&!'!,&()&3!:'-+)&0'3%,#+/&'$'3%()!%5.'!',#!(&3'
3%353!#&'1%'%$+!',#!(.@
class Data {
public void add(Info){}
public void delete(Info) {}
public void modify(Info){}
//...
}
!"#"$%"&'"!()"*'+!+,+-+")'
class AdaptData {
Data data;
public void add(Info i) {
data.add(i);
//more job
}
public void delete(Info i) {
data.delete(i);
//more job
}
public void modify(Info i) {
data.modify(i);
//more job
}
//...
}
11.3. 40#1,!31&
N*&(+-+%&0'$'!-#3,!53&'1%',!*&'&()&'%&,&(!*.'3%)*$/+,&*&!'+%$*'/!)&'-&*($%!#&'!#&'
+)3#39!)$*3#$*:'-*3%)*&',!*&'23'!/*&(!7'8(+-*!'!/*&(&3'&()&'%&,&(!*.'!-#3,!*&!'+%+3'(&)'/&'<!#3/.*3'
prin car&'(&'!(3D+*.'+%'!%+03)'D*!/'/&',$*&,)3)+/3%&7
F%353!#'!'4$()',$%,&-+)'+%'(3()&0'/&'<!#3/!*&'-&%)*+'!/*&(&#&'/3%'A;8:'30-#&0&%)!)'1%',#!(!'
USAddress. Metoda isValidAddress /3%'!,&!().',#!(.'<!#3/&!9.'!/*&(!:',$/+#'-$2)!#'23',$/+#'
statului.
5
Paradigme de Programare
Laboratorul 11
8-#3,!53!'!'%&,&(3)!)'&6)3%/&*&!'<!#3/.*33'23'!(+-*!'!/*&(&#$*'/3%'?!%!/!'/&'&6&0-#+7'N&%)*+'!'
+2+*!'23'&<&%)+!#&#&'!#)&'&6)3%/&*3:'(&',*&&!9.',#!(!'!"()*!,).'AddressValidator din care vor
&6)3%/&')$!)&',#!(&#&',&'$4&*.'<!#3/!*&'/&'!/*&(.7
AddressValidator@'$4&*!'0&)$/!'!"()*!,).'3(Q!#3/8//*&((
USAddress@'$4&*.'30-#&0&%)!*&'-&%)*+'!/*&(&#&'/3%';A8@
6
Paradigme de Programare
Laboratorul 11
if (inp_zip.trim().length() < 5)
return false;
if (inp_zip.trim().length() > 10)
return false;
if (inp_state.trim().length() != 2)
return false;
return true;
}
CAAddress@'30-#&0&%)!*&!'3%353!#.'-&%)*+'!/*&(&#&'/3%'?!%!/!@
return true;
}
CAAddressAdapter@'G*!--&*'-&()&'30-#&0&%)!*&!'3%353!#.@
return objCAAddress
.isValidCanadianAddr(inp_address, inp_zip,
inp_state);
}
Customer@',#!(!',&',$%53%&'3%4$*0!533#&'/&(-*&'+%',#3&%)'23',!*&'3%353!9.'<!#3/!*&!'!/*&(&3@
class Customer {
public static final String US = "US";
7
Paradigme de Programare
Laboratorul 11
if (type.equals(Customer.US)) {
validator = new USAddress();
}
if (type.equals(Customer.CANADA)) {
CAAddress objCAAddress = new CAAddress();
CAAddressAdapter caAdapter = new
CAAddressAdapter(objCAAddress);
validator = caAdapter;
}
if (validator == null) {
return true;
} else {
return validator.isValidAddress(address, zip, state);
}
}
name = _name;
address = _address;
zip = _zip;
state = _state;
type = _type;
}
}
?$0-#&)!53',#!(&#&'/3%'/3!D*!0.'23'*&!#39!53'$'!-#3,!53&'CD*!43,.M'/&')&()'-*3%',!*&'(&'3%)*$/+,'
/!)&#&'/&(-*&'+%'+)3#39!)$*'C1%'(-&,3!#',&#&',&')*&"+3&'<!#3/!)&M'23'-*3%'3%)&*0&/3+#'#!(&3'
Cusotmer se face validarea acestor date.
8
Paradigme de Programare
Laboratorul 10
Laboratorul 10
10.1. Introducere în Design Patterns
!"#!$%&'(!')*!+,-$'./00!"$+1'+%$2'%$'3,4'3"!/'56"#/&'3!$0"%'4!,'$!,$,7,/7,8'.!'+4%"0'9/:&6/$!&!'+%$0'
#6(/&,027,'46$;!$/:,&!'(!'/'"!56&6+,'46('6",!$0/0'6:,!40'<$0"!'3"6,!40!'9,'<$0"!'3"6-"/#/06",8 Unul
(,$0"!'4!&!'#/,'4,0/0!'9/:&6/$!'!+0!'5"/#!=6">-ul MVC (Model-View-Controller?'3!$0"%'
@#/&& /&>AB"/+$!"'9,'.63C'DEFF?8'G4!+0'3/00!"$'36/0!'5,'6:+!";/0'9,'4/'3/"0!'(,$'H*B'AJFCI'H/;/'
J6%$(/0,6$'K&/++!+C'@=,$-'46#36$!$0+?8
!"#$!%&#&'(&'(&)*$#+!,& /%'<$4!3%0'+2'5,!'"!4%$6+4%0!'#/,'56"#/&'&/'<$4!3%0%&'/$,&6"'EL'(!'420"!'
M,4N/"('O!&#'ADEEL?'9,'P",4N'Q/##/'ADEER?C'4/"!'/%'(!+4",+'9/:&6/$!'<$46"36"/0!'<$'3&/056"#/'(!'
/3&,4/7,,'QST'P UU8' 60%&'/'4%&#,$/0'4%'3%:&,4/"!/'3",#!,'42"7,'(!(,4/0!C'Design Patterns Elements
of Reusable Software, :V'Q/##/C'O!&#C'H6N$+6$'/$('W&,++,(!+ADEEX?8'K/"0!/'!+0!'(!+'"!5!",02'+%:'
numele de GoFC'+/%'-.!%/'$0'1$2,3 9,'/'/;%0'%$',#3/40'3%0!"$,4'/+%3"/'4!&6"'4/"!'<$4!"4/%'+2'
<$7!&!/-2'4%#'+2'56&6+!/+42'9/:&6/$!&!'(!'4"!/"!8
S$'&%4"%'3!'4/"!'3"6-"/#/06",,'4%'!Y3!",!$72'<&'90,%'!+0!'42'ZS'0"!:%,!'+2'"![6&;!'6",4!'3"6:&!#2'
36"$,$('(!'&/'L8'P,'3"!5!"2'+2'"!56&6+!/+42'+6&%7,,'(!+3"!'4/"!'90,%'+,-%"'42'/%'5%$47,6$/0'<$'0"!4%0'9,'3!'
4/"!'!;!$0%/&'&!-/%'0!+0/0'(!\/8'G+05!&C'4]$('6'+6&%7,!':%$2'!+0!'-2+,02C'/4!+0/';/'5,'56&6+,02'<$'#6('
"!3!0/0'/46&6'%$(!'!+0!'/3&,4/:,&28'*!'/4!!/C'<$'#%&0!'+,+0!#!'6",!$0/0!'+3"!'6:,!40'+!';6"'-2+,'
9/:&6/$!'(!'4&/+!'9,'6:,!40!'4/"!'46#%$,42'<$0"!'!&!8'G4!+0!/'"![6&;2'3"6:&!#!'+3!4,5,4!'(!'(!+,-$C'
524]$('+6&%7,,&!'#/,'5&!Y,:,&!C'#/,'!&!-/$0!'9,'#/,'/&!+C'"!%0,&,[/:,&!8
)^",4!'9/:&6$'(!+4",!'6'3"6:&!#2'4/"!'/3/"!'<$'#6('"!3!0/0'<$'#!(,%&'$6+0"%'9,'/36,'(!+4",!'
!+!$7/'+6&%7,!,'"!+3!40,;!,'3"6:&!#!'<$0"-un asemene/'#6('<$4]0'3%0!7,'%0,&,[/'+6&%7,/'(!'%$'
#,&,6$'(!'6",'52"2'+2'5/4!7,';"!6(/02'(!'(6%2'6",'/4!&/9,'&%4"%18'
P&';6":!/'(!+3"!'9/:&6/$!'3!$0"%'4&2(,",'9,'6"/9!C'(/"'4!!/'4!'/'+3%+'"2#]$!'/(!;2"/0'9,'3!$0"%'
3"6,!40/"!/'6",!$0/02'+3"!'6:,!40!8'
"!3"![!$0/"!'4/"!'36/0!'5,'%0,&,[/02'3!$0"%'/'(!+4",!'3!'+4%"0'3"6:&!#/'(!'3"6,!40/"!C'+6&%7,,&!'9,'
46$+!4,$7!&!'!,8'S$';64/:%&/"'<#:6-27,0'4%'/+05!&'(!'0!"#!$,'3!"#,0!'3"6-"/#/06",&6"'+2'
46#%$,4!'#/,'5/4,&'<$0"!'!,'9,'%9%"!/[2'#6(%&'(!'-]$(,"!'9,'/$/&,[2'/'3"6,!40!&6"8'
:5';,$"#&7!
(!+4",!'+,0%/7,/'<$'4/"!'+!'/3&,42'9/:&6$%&8'S$!6",'(!+4",!'9,'6'&,+02'(!'46$(,7,,'4!'/"'0"!:%,'
<$(!3&,$,0!'3!$0"%'/'/;!/'+!$+'/3&,4/"!/'9/:&6$%&%,8'
<5'=$#2>9!
1
Paradigme de Programare
Laboratorul 10
(!+4",!'!&!#!$0!&!'4/"!'46#3%$'(!+,-$-%&C'"!&/7,,&!C'"!+36$+/:,&,027,&!'9,'46&/:6"2",&!'/4!+06"/8'
@6&%7,/'$%'!+0!'6',#3&!#!$0/"!'46$4"!02C'4,'6'(!+4",!"!'/:+0"/402'/'0,3/"%&%,'4/"!'36/0!'5,'
/3&,4/0'<$'4/[%&'+,0%/7,,&6"'(!+4",+!'(!'3"6:&!#/'
?5'@$%A&B9%>&#&
"!3"![,$02'"![%&0/0!&!'6:7,$%0!'9,'46#3"6#,+%",&!'4/"!'0"!:%,!'524%0!'/0%$4,'4]$('+!'/3&,42'
9/:&6$%&8'G4!+0!/'/%',#36"0/$72'4",0,42'/0%$4,'4]$('+!'!;/&%!/[2'36+,:,&!&!'/&0!"$/0,;!'3!$0"%'
"![6&;/"!/'3"6:&!#!,8'
^'(!+4",!"!'/'%$%,'9/:&6$'0"!:%,!'+2'4/30%"![!'3"6(%+%&'5,$/&'/&'3"64!+%&%,'(!'3"6,!40/"!8'.!$0"%'/'
3%0!/'"!%0,&,[/'(!+,-$-%&C'0"!:%,!'+2'<$"!-,+0"2#'(!4,[,,&!C'/&0!"$/0,;!&!'9,'46#3"6#,+%",&!'4/"!'/%'
46$(%+'&/'6:7,$!"!/'9/:&6$%&%,8'Z%'0"!:%,!'%,0/0!'!Y!#3&!&!'46$4"!0!C'/4!+0!/'!Y!#3&,5,4]$('4!&'#/,'
%96"'5%$47,6$/&,0/0!/'9/:&6$%&%,8
627&#&'89'B#!A909B!,&! 9/:&6$%&%,I';/'5/4!'3/"0!'(,';64/:%&/"%&'(!'3"6,!40/$0
C&09%9>9&I'4!'5/4!_'4/"!'!+0!'"/7,%$!/_888
D$+9*!>9&I'+4!$/",%'4/"!',&%+0"!/[2'3"6:&!#/'(!'"![6&;/0
EF#9B!"9#9+!+&I'+,0%/7,,&!'<$'4/"!'36/0!'5,'/3&,4/0
=+,2B+2,GI'"!3"![!$0/"!'-"/5,42'/'4&/+!&6"'AS`a?
;!,+9B9F!%>9I'4&/+!&!b6:,!40!&!
@$#!"$,G,9I'#6(%&'<$'4/"!'3/"0,4,3/$7,,'46#%$,42
@$%A&B9%>&I'#2+%"/'<$'4/"!'9/:&6$%&'"!%9!90!'+2'"![6&;!'3"6:&!#/'3"63%+2
H7F#&7&%+!,&I'0!N$,4,'+3!4,/&!'4!'360'5,'56&6+,0!C'!Y,+0!$7/'%$6"'!&!#!$0!'+3!4,5,4!'
&,#:/\%&%,'56&6+,0
IJ&7F#&I'5"/-#!$0!'(!'46('46$4"!0!
K+9#9)G,9'B2%$AB2+&I'!Y!#3&!'(!'56&6+,"!'<$'+,+0!#!'"!/&!
!"#$!%&'L%,2(9+&I'9/:&6/$!'+0"]$+'&!-/0!C'3",$4,3/&!&!'(,5!"!$7!
10.1.3. Clasificare
Z%#2"%&'#/"!'(!'9/:&6/$!'(!'3"6,!40/"!'(%4!'&/'$!4!+,0/0!/'(!'6"-/$,[/"!'/'&6"'<$'5/#,&,,'(!'9/:&6/$!'
<$"%(,0!8'K",0!",,&!'(!'4&/+,5,4/"!'+%$0'+463%&'A4"!/7,6$/&C'+0"%40%"/&'9,'46#36"0/#!$0/&?'9,'(6#!$,%&'
A4&/+/'+/%'6:,!40%&?8
R
Paradigme de Programare
Laboratorul 10
=B$F
@,&!>9$%!# =+,2B+2,!# @$7F$,+!7&%+!#
@#!AG J/406"V'`!0N6( G(/30!"'A4&/+2? T$0!"3"!0!"
!#3&/0!'`!0N6(
G:+0"/40'J/406"V G(/30!"'A6:,!40? KN/,$'65'M!+36$+,:,&,0V
J&V=!,-N0 ^:+!";!"
."6YV State
Strategy
W,+,06"
45646)6 Folosire
.!$0"%'4!,'4/"!'+!'<$0"!/:2'(/42'0"!:%,!'+2'<$;!7!'9/:&6/$!'(!'3"6,!40/"!C'"2+3%$+%&'!+0!'+,#3&%I'3!$0"%'
/'5,'%$'3"6-"/#/06"'H/;/'3"65!+,6$,+0'A+/%'<$'6",4!'/&0'&,#:/\'(!'3"6-"/#/"!'<$'4/"!'+!'360'/3&,4/'
3",$4,3,,&!'.^^?'0"!:%,!'4%$6+4%0!'#24/"'6'3/"0!'(,$0"!'+6&%7,,&!'46#%$!'(!'"![6&;/"!'/'3"6:&!#!&6"'
4%"!$0!8'^(/02'<$+%9,0!'/4!+0!'9/:&6/$!C'!Y3!",!$7/';/'4"!90!'+,#7,06"C'%9%",$7/'(!',#3&!#!$0/"!'/'
+6&%7,,&6"'<$'#6('!5,4,!$0';/'5,';,[,:,&2C',/"'46#%$,4/"!/'4%'4!,&/&7,'3"65!+,6$,90,';/'/;!/'(6/"'(!'
4]90,-/08
K]0!'9/:&6/$!'+%$0_'`%&0!8'K!&!'Rc'3"![!$0/0!'(!'Q6J'+%$0'3",$0"!'4!&!'#/,':,$!'4%$6+4%0!8'd$'
-!$!"/&C'3!$0"%'/',#3&!#!$0/'6'+6&%7,!C'!+0!'$!;6,!'(!'#/,'#%&0!'9/:&6/$!'56&6+,0!'<#3"!%$28'*,5!",7,'
3"6-"/#/06",'360'5/4!'/&!-!",'(,5!",0!'3!$0"%'"![6&;/"!/'/4!&!/9,'3"6:&!#!8
3
Paradigme de Programare
Laboratorul 10
10.2. 7!"#$!%(&1'(!8.$%!#(
e/:&6/$!&!'(!'3"6,!40/"!'4/"!'/%'AB$F'B,&!>9$%!# /:+0"/40,[!/[2'3"64!+%&'(!',$+0/$7,!"!8'
G4!+0!'9/:&6/$!'/\%02'&/'"!/&,[/"!/'%$%,'+,+0!#',$(!3!$(!$0'(!'#6(%&'<$'4/"!'6:,!40!&!'+%$0'
4"!/0!C'46#3%+!'9,'"!3"![!$0/0!8
.!'#2+%"2'4!'+6&%7,,&!'(!;,$'060'#/,'46#3&!Y!C'!&!'<$4!3 +2'(!3,$(2'#/,'#%&0'(!'4"!/"!/'9,'
46#3%$!"!/'6:,!40!&6"'(!4]0'(!'+,+0!#%&'(!'#690!$,",'9,',#3&!#!$02",8'K"!/"!/'
46#36$!$0!&6"'4%'%$'/$%#,0'46#36"0/#!$0'$!4!+,02'#/,'#%&0'(!4]0'6'+,#3&2',$+0/$7,!"!'/'
%$!,'4&/+!8'd$'/4!+0'46$0!Y0'9/:&6/$!&!'4"!/7,6$/&!'(!;,$'(,$'4!'<$'4!'#/,',#36"0/$0!8'
Un 8!"#$%'B,&!>9$%!#'(&'B#!AG 56&6+!90!'#690!$,"!/'3!$0"%'/';/",/'4&/+/'4/"!'!+0!',$+0/$7,/02C'
iar un 8!"#$%'B,&!>9$%!#'(&'$"9&B+ 56&6+!90!'%$'/&0'6:,!40'3!$0"%'/'"!/&,[/',$+0/$7,!"!/8
T$0!"5!7!&!'6:,!40!&6"'56&6+,0!'4%'/\%06"%&'%$6"'/+05!&'(!'9/:&6/$!'+%$0'(!5,$,0!'(!'4&/+!'
/:+0"/40!8'G+05!&'+!'/+,-%"2'5&!Y,:,&,0/0!/'/+%3"/I'B& +!'4"!!/[2C'B9%& 4"!!/[2C'B27 9,'BN%( se
4"!!/[28'G4!/+0/'3!"#,0!'46$5,-%"/"!/'%$6"'(,;!"+!'6:,!40!C'/'42"6"'+0"%40%"2'9,'5%$47,6$/&,0/0!'
360';/",/'#%&08'K6$5,-%"/"!/'+!'36/0!'"!/&,[/'A+!+9B'A3"!4,[/"!'&/'46#3,&/"!?C'+/%'(9%!79B
A3"!4,[/"!'&/'!Y!4%7,!?8
- 9/:&6$'4"!/7,6$/&'(!'4&/+2
1) !"#$#%#!
e/:&6$%&'(!5,$!90!'6',$0!"5/72'3!$0"%'4"!/"!/'%$%,'6:,!40C'(/"'3!"#,0!'+%:4&/+!&6"'+2'(!4,(2'4!'4&/+2'
;6"',$+0/$7,/8'^'4&/+2'36/0!'+2'(!&!/-2',$+0/$7,!"!/'&/'+%:4&/+!8
e/:&6$%&'+!'#/,'$%#!90!'9,'B$%A+,2B+$,'*9,+2!#8
2) &'(#)*+#(#,*,!-.#-+!$!"#)##
K6$!40!/[2',!"/"N,,'3/"/&!&!'(!'4&/+!
^'4&/+2'(6"!90!'4/'+%:4&/+!&!'+/&!'+2'3"!4,[![!'6:,!40!&!'3!'4/"!'&!'4"!!/[2
^'4&/+2'$%'36/0!'/$0,4,3/'4&/+/'6:,!40!&6"'3!'4/"!'0"!:%,!'+2'&!'4"!![!
K6(%&'0"!:%,!'+2'&%4"![!'4%',$0!"5!7!'9,'$%'4%'6:,!40!',#3&!#!$0/0!
G+4%$(!'4&,!$0%&%,'4&/+!&!'46$4"!0!
^:,!40%&'"!0%"$/0'36/0!'5,'%$%&'/:+0"/40'+/%'%$%&'46$4"!0
J%"$,[!/[2'3%$40!'(!'/$46"/"!'3!$0"%'+%:4&/+!C'4!!/'4!'!+0!'#/,'5&!Y,:,&'(!4]0'4"!/"!/'(,"!402'
/'6:,!40!&6"
4
Paradigme de Programare
Laboratorul 10
S"#/"!/'46$;!$7,,&6"'(!'(!$%#,",'+!'36/0!'/\%0/'"!4%$6/90!"!/'+0"%40%",,'46(%&%,'(!'420"!'
4!,&/&7,'3"6-"/#/06",
3) Structura
4) /*0,#)#'*$%#
;,$(2B+
*!5,$!90!',$0!"5/7/'3!$0"%'6:,!40!&!'4"!/0!'(!'#!06(/'(!'/0!&,!"'
@$%B,&+&;,$(2B+
T#3&!#!$0!/[2',$0!"5/7/'."6(%40'
@,&!+$,
`!06(/'(!'/0!&,!"'4/"!'"!0%"$!/[2'%$'6:,!40'(!'0,3'."6(%40'
@$%B,&+&;,$(2B+
M!(!5,$!90!'#!06(/'(!'/0!&,!"'/+05!&'<$4]0'+2'"!0%"$![!'6',$+0/$72'/'%$%,'6:,!40'
K6$4"!0!."6(%40'
d$'(!5,$,"!/'#!06(!,'(!'/0!&,!"C'4&/+/'K"!/06"'+!':/[!/[2'3!',#3&!#!$02",&!'(,$'+%:4&/+!&!'+/&!C'+463%&'
5,,$('"!0%"$/"!/'%$!,',$+0/$7!'(!'%$'0,3'K6$4"!0!."6(%40'46"!408
X
Paradigme de Programare
Laboratorul 10
10.2.2. 9",+'!1+&:!1+$';
- 9/:&6$'4"!/7,6$/&'(!'6:,!40
1) !"#$#%#!
e/:&6$%&'5%"$,[!/[2'6',$0!"5/72'3!$0"%'4"!/"!/'5/#,&,,&6"'(!'6:,!40!'<$"%(,0!'+/%'(!3!$(!$0!C'52"2'/'
+3!4,5,4/'<$+2'4&/+!&!'&6"'46$4"!0!8
e/:&6$%&'+!'#/,'$%#!90!'+,'Kit8
2) Aplicabi(#,*,!-.#-+!$!"#)##
E"A+,!B+'1!B+$,O';!++&,% !+0!'4%'%$'$,;!&'(!'/:+0"/40,[/"!'#/,'#/"!'(!4]0'J!406"V'`!0N6(8G4!+0'
9/:&6$'!+0!'%0,&'/0%$4,'4]$('+!'(6"!90!'6:7,$!"!/'%$!,/'(,$0"!'#/,'#%&0!'4&/+!'"!&/7,6$/0!'<$0"!'!&!C'
5,!4/"!'(,$0"!'/4!+0!/'3%0]$('"!0%"$/'&/'4!"!"!'(,5!",0!'6:,!40!8'K%'/&0!'4%;,$0!C'G:+0"/40'J/406"V'!+0!'
%$')5/406"V1'4/"!'"!0%"$!/[2'%$%&'(,$0"!'#/,'#%&0!'6:,!40!'5/406"V8
^'/3&,4/"!'4&/+,42'/'9/:&6$%&%,'G:+0"/40'J/406"V'!+0!'/0%$4,'4]$('/3&,4/7,/'/"!'$!;6,!'+2'+%36"0!'#/,'
%&0!',$0!"5!7!'%0,&,[/06"')look-!%(-0&C'!YI'f,$(6=+C'`60,5C'`/4,$06+N?8'*!'!Y!#3&%'(/42'+!'(6"!90!'
6',$0!"5/72'(!'0,3'f,$(6=+C'/0%$4,'5/406"V-%&'"!0%"$!/[2'%$'QST'5/406"VC'4/"!'&/'"]$(%&'+2%'4"!!/[2'
6:,!40!'(!'4%'46#36"0/#!$0'(!'0,3'f,$(6=+8
@N%('A&'!F#9BG
- Sistemul treb%,!'+2'5,!',$(!3!$(!$0'(!'#6(%&'<$'4/"!'+%$0'4"!/0!'9,'3"![!$0/0!'3"6(%+!&!'+/&!'
- @,+0!#%&'0"!:%,!'+2'5,!'46$5,-%"/0'4%'%$/'(,$'#/,'#%&0!'5/#,&,,'(!'3"6(%+!'
- @!'(6"!90!'5%"$,[/"!/'%$!,':,:&,60!4,'(!'4&/+!'(!'3"6(%+!'9,'+!'(6"!90!'(!4]0'3"![!$0/"!/'
inte"5!7!&6"'/4!+06"/C'$%'9,'/',#3&!#!$02",&6"'&6"'
E*!%+!P&
- !"#$##$%&'%&()*'+,%&(*-&.#&+/*)&,01#"2!-%&,!+-%),01#"2!-%8'J/#,&,/'(!'3"6(%+!'56&6+,02'
!+0!'+3!4,5,4/02'6'+,$-%"2'<$'/3&,4/7,!I'/0%$4,'4]$('4&/+/'%$%,'/0!&,!"'46$4"!0'!+0!',$+0/$7,/028'
d$0"!/-/ 5/#,&,!'(!'3"6(%+!'36/0!'5,'+4N,#:/02'/+05!&'3",$'+,#3&/'+4N,#:/"!'/'/0!&,!"%&%,'
46$4"!08'
- 4*3,#,-%35!&()*'+,%$*)&%,-%&!,#6+)!-78'*!6/"!4!'6:,!40!&!'3"6(%+'(,$0"-6'5/#,&,!'(!'6:,!40!'
+%$0'3"6,!40/0!'3!$0"%'/'&%4"/'<#3"!%$2C'!+0!';,0/&'4/'&/'%$'#6#!$0'(/0'+2'+!'56&6+!/+42'
<#3"!%$2'(6/"'6:,!40!'(,$'/4!!/9,'5/#,&,!8'
."6:&!#!'360'/32"!/'/0%$4,'4]$('+!'(6"!90!'&J+9%(&,&!'!+	&,&#$,'!"A+,!B+&8'G4!+0'&%4"%'$%'!+0!'
064#/,'5/4,&'4]$('+!'56&6+!90!'/4!+0'9/:&6$C'(!6/"!4!'+!0%&'(!'3"6(%+!'4/"!'360'5,'4"!/0!'!+0!'5,Y/0'(!'
6
Paradigme de Programare
Laboratorul 10
420"!',$0!"5/7/'G:+0"/40J/406"V8'@%36"0%&'3!$0"%'$6,'0,3%",'(!'3"6(%+!'$!4!+,02'#6(,5,4/"!/'
G:+0"/40J/406"VC'4!!/'4!',#3&,42'9,'#6(,5,4/"!/'0%0%"6"'+%:4&/+!&6"'/4!+0!,/8
3) Structura
4) /*0,#)#'*$%#
E"A+,!B+1!B+$,O
G0!&,!"'/:+0"/40I'(!4&/"2'6',$0!"5/72'3!$0"%'63!"/7,,'4/"!'4"!/[2'6:,!40!'3"6(%+'/:+0"/40!'
@$%B,&+&1!B+$,O
G0!&,!"'46$4"!0I',#3&!#!$0!/[2'63!"/7,,&!'3!$0"%'4"!/"!/'6:,!40!&6"'3"6(%+'46$4"!0!'
E"A+,!B+;,$(2B+
T$0!"5/72'3!$0"%'%$'0,3'(!'6:,!40'3"6(%+'
@$%B,&+&;,$(2B+
^:,!40'3"6(%+'4/"!'36/0!'5,'4"!/0'(!'/0!&,!"%&'46$4"!0'46"!+3%$[206"'
Client
S0,&,[/06"%&'4/"!'56&6+!90!'(6/"',$0!"5!7!&!'(!4&/"/0!'(!'G:+0"/40J/406"V'9,'."6(%40J/406"V'
S[%/&C'&/'!Y!4%7,!'+!'4"!!/[2'6'+,$-%"2',$+0/$72'/'%$!,'4&/+!'(!'0,3'K6$4"!0!J/406"VC'4/"!'/+,-%"2'
4"!/"!/'6:,!40!&6"'(,$0"-6'/$%#,02'5/#,&,!8'.!$0"%'4"!/"!/'(!'6:,!40!'3"6(%+'(,5!",0!C'0"!:%,!'56&6+,02'
%$'/&0'/0!&,!"'46$4"!08'G:0"/40J/406"V'0"/$+5!"2'+/"4,$/'(!'/'4"!/'$6,'6:,!40!'3"6(%+'420"!',$+0/$7/'
+%:4&/+!,'K6$4"!0!J/406"V8
7
Paradigme de Programare
Laboratorul 10
10.2.3. Singleton
- 9/:&6$'4"!/7,6$/&'(!'6:,!40
1) !"#$#%#!
e/:&6$%&'/+,-%"2'5/30%&'42'6'4&/+2'/"!'6'+,$-%"2',$+0/$72'9,'42'!+0!'65!",0'%$'3%$40'-&6:/&'(!'/44!+'&/'
/4!/+02',$+0/$72'%$,428
2) &'(#)*+#(#,*,!-.#-+!$!"#)##
@N%('A&'!F#9BG
- ^'4&/+2'0"!:%,!'+2'/,:2'6'+,$-%"2',$+0/$72',/"'/4!/+0/'0"!:%,!'+2'5,!'/44!+,:,&2'4&,!$7,&6"'(,$0"-
%$'3%$40'(!'/44!+'4%$6+4%0'
- S$,4/',$+0/$72'0"!:%,!'+2'36/02'5,'!Y0,$+2'3",$'-!$!"/"!'(!'+%:4&/+!C',/"'4&,!$7,,'0"!:%,!'+2'
36/02'56&6+,'$6%/',$+0/$72'!Y0,$+2C'52"2'/'0"!:%,'+/'#6(,5,4!'46(%&'
E*!%+!P&
- 800%,+$&$!,-!35!&+3#07&%,-%&0*3-)*$!-8'K&/+/'@,$-&!06$'<$4/3+%&!/[2'%$,4/'+/',$+0/$72'9,'
36/0!'/;!/'%$'46$0"6&'+0",40'/+%3"/'#6(%&%,'9,'#6#!$0%&%,'(!'/44!+'/+%3"/',$+0/$7!,8'
- 8$-%)3!-#:!&.*$*,#)##&*(%)!5##$*)&'%&0$!,7&%,-%&"!#&(+5#3&.$%;#2#$78'*,5!"!$7/'+!';!(!'/0%$4,'
4]$('+!'(6"!90!'4"!/"!/'9,'/44!+%&'&/'#/,'#%&0!',$+0/$7!'/&!'4&/+!,8'
3) Structura
4) /*0,#)#'*$%#
=9%/#&+$%
*!5,$!90!'6'63!"/7,!'(!'4&/+2'H%A+!%B& 3",$'4/"!'4&,!$7,,'360'/44!+/',$+0/$7/'%$,428'G4!/+02'
63!"/7,!'36/0!'5,'9,'"!+36$+/:,&2'4%'4"!/"!/',$+0/$7!,'%$,4!'
K&,!$7,,'/44!+!/[2',$+0/$7/'%$,42'(6/"'3",$',$0!"#!(,%&'63!"/7,!,'T$+0/$4!'65!",02'(!'@,$-&!06$8
F
Paradigme de Programare
Laboratorul 10
456<6)6 Builder
- 9/:&6$'4"!/7,6$/&'(!'6:,!40
1) !"#$#%#!
e/:&6$%&'+!3/"2'46$+0"%47,/'%$%,'6:,!40'46#3&!Y'(!'"!3"![!$0/"!/ /4!+0%,/C'4%'+463%&'(!'/'3!"#,0!'
/4!&%,/9,'3"64!+'(!'46$+0"%47,!'+2'36/02'4"!/'"!3"![!$02",'(,5!",0!8
2) &'(#)*+#(#,*,!-.#-+!$!"#)##
@N%('A&'!F#9BG
- "!:%,!'4"!/0'%$'6:,!40'46#3&!YC',/"'/&-6",0#%&'(!'4"!/"!'0"!:%,!'+2'5,!',$(!3!$(!$0'(!'
6:,!40!&!'#/,'+,#3&!'4/"!'46#3%$'6:,!40%&'46#3&!Y'9,'(!'#6(%&'<$'4/"!'/4!+0!/'+%$0'
asamblate
- ."64!+%&'(!'46$+0"%47,!'0"!:%,!'+2'3!"#,02'"!3"![!$02",'(,5!",0!'3!$0"%'6:,!40%&'4/"!'!+0!'
46$+0"%,0'
E*!%+!P&
- <%()%=%3-!)%!-%)37&!&+3+#&()*'+,&(*!-%&.#&:!)#!-78'g%,&(!"-%&'65!"2'6',$0!"5/72'/:+0"/402'
3!$0"%'46$+0"%,"!/'3"6(%+%&%,'4/"!'/+4%$(!'+0"%40%"/'9,'#6(%&'(!'/+/#:&/"!8'.!$0"%'/'+4N,#:/'
"!3"![!$0/"!/',$0!"$2'+!'(!5,$!90!'%$'$6%'0,3'(!':%,&(!"8'
- 4*'+$&(%3-)+&0*3,-)+#)%&/#&)%()%=%3-!)%&%,-%&#=*$!-8'K/"/40!"%&'#6(%&/"'!+0!'<#:%$2027,08'
- >)!'&)#'#0!-&'%&0*3-)*$&!,+()!&()*0%,+$+#&'%&0*3,-)+05#%8'."6(%+!&!'$%'+%$0'46$+0"%,0!'
,$+0/$0/$!%8'g%,&(!"-%&'46$+0"%,!90!'3"6(%+%&'3/+'4%'3/+C'46$0"6&/0'(!'*,"!406"8
3) Structura
E
Paradigme de Programare
Laboratorul 10
4) /*0,#)#'*$%#
Q29#(&,
T$0!"5/72'/:+0"/402'3!$0"%'4"!/"!/'32"7,&6"'%$%,'6:,!40'."6(%40'
@$%B,&+&Q29#(&,
T#3&!#!$0!/[2',$0!"5/7/'g%,&(!"I'46$+0"%,!90!'9,'/+/#:&!/[2'32"7,'/&!'3"6(%+%&%,C'65!"2'
63!"/7,!'3!$0"%'3"!&%/"!/'3"6(%+%&%,'
*!5,$!90!'9,'7,$!'!;,(!$7/'"!3"![!$02",,'3!'4/"!'6'4"!!/[2'
DireB+$,
K6$+0"%,!90!'6:,!40%&'46#3&!Y'%0,&,[]$(',$0!"5/7/'g%,&(!"'
;,$(2B+
^:,!40%&'46#3&!Y'(!'46$+0"%,08'M!3"![!$0/"!/'+/',$0!"$2'9,'3"64!+%&'(!'/+/#:&/"!'+%$0'(/0!'(!'
K6$4"!0!g%,&(!"8'K6$7,$!'4&/+!'4!'(!5,$!+4'32"7,&!'46$+0,0%0,;!'9,',$0!"5!7!'3!$0"%'/+/#blarea
&6"'<$'"![%&0/0%&'5,$/&'
K&,!$0%&'4"!!/[2'%$'g%,&(!"'3",$',$+0/$7,!"!/'%$%,'K6$4"!0!g%,&(!"8'G36,'4"!!/[2'%$'*,"!406"'3!'4/"!'
<&'(!46"!/[2'4%':%,&(!"-%&'(6",08'*,"!406"%&'<$90,,$7!/[2'g%,&(!"-%&'6",4]$('!+0!'$!4!+/"2'4"!/"!/'%$!,'
3/"7,'(,$0"-%$'3"6(%+C',/"'/4!+0/'"2+3%$(!'3",$'/(2%-/"!/'32"7,&6"'4!"%0!'&/'3"6(%+8'a/'5,$/&'4&,!$0%&'
3"!,/'3"6(%+%&'46$+0"%,0'(!'&/'g%,&(!"8
10
Paradigme de Programare
Laboratorul 10
10.2.5. ='$+$+;3(
- 9/:&6$'4"!/7,6$/&'(!'6:,!40
1) !"#$#%#!
G0%$4,'4]$('4"!/"!/'(!'$6,',$+0/$7!'/'%$6"'4&/+!'!+0!'46#3&!Y2'+/%'46$+%#/06/"!'(!'#%&0'0,#3C'+!'
56&6+!90!'6',$+0/$72'3"6060,3'3",$'4/"!'+!'3"!4,[!/[2'0,3%",&!'(!'6:,!40!'4!';6"'5,'4"!/0!'9,'+!'4"!!/[2'
$6,&!'6:,!40!'463,,$('/4!+0'3"6060,38
2) &'(#)*+#(#,*,!-.#-+!$!"#)##
d$'&64'(!'/'0"!4!'#!"!%'3",$'/4!&/9,'3"64!+'46#3&!Y'(!'4"!/"!'(!'$6, ,$+0/$7!C'!+0!'#/,'+,#3&%'+2'+!'
5/42'463,,'/&!',$+0/$7!,'6",-,$/&!C'463,,'4!'360'5,'#6(,5,4/0!'$%#/,'<$'3%$40!&!'<$'4/"!'(,5!"28
@N%('A&'!F#9BG
- @,+0!#%&'$%'0"!:%,!'+2'(!3,$(2'(!'#6(%&'<$'4/"!'6:,!40!&!'+%$0'4"!/0!'9,'"!3"![!$0/0!'
- PY,+02'#%&0!'+%:4&/+!'4/"!'(,5!"2'$%#/,'3",$'0,3%&'6:,!40!&6"'
- K&/+!&!'4/"!'0"!:%,!',$+0/$7,/0!'+%$0'3"!4,[/0!'(,$/#,4C'&/'!Y!4%7,!'
E*!%+!P&
- ?)*'+,%$%&(*-&.#&!'7+6!-%&,!+&%$#"#3!-%&$!&%;%0+5#%8'@!'36/0!',$0"6(%4!'6'$6%2'4&/+2'
46$4"!02'3"6(%+'<$'+,+0!#'3",$'+,#3&/'<$"!-,+0"/"!'/',$+0/$7!,'3"6060,3'&/'4&,!$08'
S$'(![/;/$0/\'/&'/4!+0%,'9/:&6$'/" 3%0!/'5,'5/30%&'42'5,!4/"!'4&/+2'4!'0"!:%,!'4&6$/02'0"!:%,!'+/'
,#3&!#!$0![!'63!"/7,/'K&6$!A?'(,$',$0!"5/7/'."6060V3!8'G4!+0'&%4"%'/"'3%0!/'5,'(,5,4,&C'#/,'/&!+'(/42'
4&/+!&!'"!+3!40,;!'!Y,+02'(!\/C'+/%'46$7,$'6:,!40!'4!'$%'3!"#,0'463,!"!/'+/%'/%'"!5!",$7!'4,"4%&/"!8
11
Paradigme de Programare
Laboratorul 10
3) Structura
4) /*0,#)#'*$%#
;,$+$+OF&
*!4&/"2'6',$0!"5/72'3!$0"%'4&6$/"!/'+/'
@$%B,&+&;,$+$+OF&
T#3&!#!$0!/[2',$0!"5/7/'3!$0"%'4&6$/"!/'+/'
Client
K"!!/[2'%$'6:,!40'$6%'4!"]$('%$%,'3"6060,3'+2'+!'4&6$![!'
DR
Paradigme de Programare
Laboratorul 10
10.3. >?(*3#(&:!1+$';&@(+A$2
10.3.1. >?(*3#Bl 1
De eY!#3&%'3!$0"%'/'"!/&,[/'%$'(!+!$'#/,'46#3&!Y'!+0!'$!;6,!'(!'6',!"/"N,!'(!'4&/+!'4/"!'/"'
3%0!/'/"20/'/+05!&I
interface Shape {
public void draw();
}
class Line implements Shape {
Point x, y;
Line(Point a, Point b) {
x = a;
y = b;
}
public void draw() {
//draw a line;
}
}
class Square implements Shape {
Point start;
int width, height;
Square(Point s, int w, int h) {
start = s;
width = w;
height = h;
}
public void draw() {
//draw a square;
}
}
class Circle implements Shape {
....
}
G4!/+02',!"/"N,!'(!'4&/+!'!+0!'56&6+,02'(!'420"!'%$'6:,!40'(!'46$0"6&'3",$'4/"!'+!'"!/&,[!/[2'
desenarea:
class Painting {
Point x, y;
int width, height, radius;
Painting(Point a, Point b, int w, int h, int r) {
x = a;
y = b;
width = w;
height = h;
radius = r;
}
Shape drawLine() {
return new Line(x,y);
}
Shape drawSquare() {
return new Square(x, width, height);
}
Shape drawCircle() {
return new Circle(x, radius);
}
....
13
Paradigme de Programare
Laboratorul 10
!"#-$%&'()*&+),%-,%",."%&*,.",&%&#%'/",&%0)%0$($.)",%1!%2$-/(%/#23"$#4
Shape pic;
Painting pt;
//initializing pt
....
if (line)
pic = pt.drawLine();
if (square)
pic = pt.drawSquare();
if (circle)
pic = pt.drawCircle();
5(&.&%6&)!")!7%*$!+)!,%-,%0&'"%)2'(,2,!"&#,&%'&"",#!-/(/)8%)&#%&*,&."3%)2'(,2,!"&#,%'$&",%0)%
#,&()9&"3%1!%-):,#.,%2$-/#);%<,%,=,2'(/%.,%'$"%*#,&%*$!."#/*"$#)%*/%-):,#>)%'&#&2,"#)%',!"#/%&%
*#,&%$?),*"/(%-orit:
class Painting {
...
Painting(Point a, Point b) {
new Line(a, b); //draw a line
}
Painting(Point a, int w, int h) {
new Square(a, w, h); //draw a square
}
Painting(Point a, int r){
new Circle(a, r); //draw a circle
}
...
}
@,%'$"%0$($.)%-,%&.,2,!,&%-):,#.,%2,"$-,%',!"#/%&%#,&()9&%$',#&+)&%-,%-,.,!&#,%'#$'#)/9).34
class Painting {
...
Painting(Point a, Point b) {
draw(a, b); //draw a line
}
Painting(Point a, int w, int h) {
draw(a, w, h); //draw a square
}
Painting(Point a, int r){
draw(a, r); //draw a circle
}
...
}
A,"$-&%-#&BCD%&!",#)$%,.",%./'#&1!*3#*&"3;
10.3.2. !"#$%&%'(
E*,."&%,.",%/!%,=,2'(/%-,.%1!"F(!)"%',!"#/%G&*"$#H%A,"I$-%-,.)7!;%@3%'#,./'/!,2%*3%&:,2%
mai multe s).",2,%-,%."$*&#,%&%)!0$#2&+))($#%&0(&",%1!%-):,#.,%($*&+));%J$7)*&%-,%(/*#/%&./'#&%
-&",($#%."$*&",%,.",%&*,,&>)8%0))!-%1!%&*,,&>)%&'()*&+),;%@,%'$&",%0$($.)%/!%-).'$9)"):%($*&(%.&/%
/!/(%#,2$",8%)&#%-,*)9)&%&'&#+)!,%/")()9&"$#/(/);
14
Paradigme de Programare
Laboratorul 10
interface DatabaseService {
public DataInfo getDataInfo() throws Exception;
public FieldInfo getFieldInfo() throws Exception;
public void write(FieldInfo fi) throws Exception;
public void modify(FieldInfo fi) throws Exception;
public void delete(FieldInfo fi) throws Exception;
//...
}
class Data implements DatabaseService {
M?.,#:32%*3%0$($.)!-%G&*"$#H%'&"",#!%)!."&!+),2%$?),*"/(%1!%2$-%-,',!-,!"%-,%&(,7,#,&%(&%
2$2,!"/(%)!)+)&()93#))8%-&#%&'()*32%&./'#&%&*,.",)%)!."&!+,%$',#&+))(,%*$2/!,%!,*,.&#,%1!%
&'()*&+),;
10.3.3. !"#$%&%')
@3%#,&()932%/!%,=,2'(/%*$!*#,";%@3%!,%)2&7)!32%$%&'()*&+),%*,%"#,?/),%.3%$',#,9,%&./'#&
/!$#%0)>),#,%1!%-):,#.,%0$#2&",8%)&#%$',#&+))(,%&'()*&",%&./'#&%-&",($#%-)!%&*,.",%0)>),#,%.3%0),%
*$2/!,;
6,!"#/%&%0$($.)%($7)*3%*$2/!3%&./'#&%-):,#.,($#%*(&.,%*,%*$!"#$(,&93%-):,#.,%0$#2&"-uri de
0)>),#,8%#,&()932%$%),#&#I),%'#)!%)!",#2,-)/(%)!",#0,+,)%<).'(&H4
// Display.java
package test;
interface Display {
// incarca fisier
public void load(String fileName);
KL
Paradigme de Programare
Laboratorul 10
// format XML
class XMLFile implements Display {
// format binar
class DBFile implements Display {
!%&'()*&+)&%-,%",."%&(,7,2%")'/(%-,%0)>),#%0$($.)"%'#)!%)!",#2,-)/(%/!/)%/2,!"%"#)2).%1!%()!)&%
-,%*$2&!-3%&"/!*)%*F!-%.,%#/(,&93%&'()*&+)&4
// TestFactory.java
package test;
class TestFactory {
16
Paradigme de Programare
Laboratorul 10
display.formatConsistency();
}
}
N!%,=,2'(/%-,%#/(&#,%&#%0)%/#23"$#/(4
C:\>java TestFactory 1
load from a txt file
txt file format changed
*+,-, !"#$%&'./012341'5341627
O2'(,2,!"&+)%),#&#I))(,%-,%*(&.,%C)!",#0,+,D%-)!%-)&7#&23%$0,#)!-%)2'(,2,!"3#)%-,%",."&#,%
2,"$-,($#%*$!*#,",8%*/2%&#%0)4
17
Paradigme de Programare
Laboratorul 10
</'3%*/2%.,%$?.,#:38%&'()*&+)&%*&#,%0$($.,>",%&*,.",%*(&.,%)2'(,2,!",&93%/!%.).",2%-,%
*3/"&#,%2&>)!)%-/'3%&!/2)",%*#)",#))4%*&",7$#),%>)%")'%C',!"#/%.)2'()"&",%&*,.",&%'$"%0)%@NQ%.)%
5%#,.',*"):%(/=%.&/ non-(/=D;
R,&()9&+)%$%)!",#0&+3%.)2'(3%'#)!%*&#,%.,%)!"#$-/*%*,(,%-$/3%*#)",#))%-,%*3/"&#,%>)%&0)>,&93%
2$-/(/(%73.)";
6&#",&%(,7&"3%,=*(/.):%-,%0$($.)#,&%'&"",#!-/(/)%'$&",%0)%)2'(,2,!"&"3%-/'3%,=,2'(/(%/#23"$#4
if (vhType.equals(AutoSearchUI.CAR)) {
Car c = vf.getCar();
searchResult = "Name: " + c.getCarName() + " Features: "
+ c.getCarFeatures();
}
if (vhType.equals(AutoSearchUI.SUV)) {
SUV s = vf.getSUV();
searchResult = "Name: " + s.getSUVName() + " Features: "
+ s.getSUVFeatures();
}
KP
Paradigme de Programare
Laboratorul 9
Laboratorul 9
9.1. Aplica ii Client-Server
Client-Server !" #$#%&'(" )"*&+#,&(-#)%& #! #! ,%&+#*-#!(!" .#(-/$&.%"()#0-#,%&" %#!%#! &1 (#) %#
client, implementarea realizându-! #3 #& 4*5+#, !" #$#& 6 %#3 #)%5)*5%"$%& 7#8( )%& #)5( -"#!%*#! &1 &#
conectat într-$#& 6 %#,$%" #3 #%! . - %#/(#-*.("#2(#nod.
8( )%& #(-!"%-6+#)5( -"#,$%" #"&(.(" #) & &(#)+"& #*-*5#!%*#.%(#.*5" #! &1 & #)$- )"%" 7#9-!"%-6 5 #! &1 &#
,$"#%)) ,"%#%) !" #) & &(:#,&$) !%#3%" 5 #2(#& "*&-%#(-/$&.%6((5 #) &*" 7#;-#%,5()%6((5 #)*& -" #3 #) 5 #
.%(#.*5" #$&(#)5( -6((#!*-"#<&$=! &-ele = <:#)5( -6((#3 # .%(5#2(#)5( -6((#3 #)'%":#(%&#! &1 &-ele pot fi
! &1 & #= <:#! &1 & #3 #<%> #3 #3%" :#! &1 & #3 #.%(5:#/(2( & #!%*#(.,&(.%-" 7#9-" &%)6(*- %#3(-"& #
%,5()%6((5 #)5( -"#2(#) 5 #! &1 &# !" #3 !)&(!+#3 #& 4*5+#,&(-#3(%4&%. #! )1 -6(%5 7#?) !tea sunt
standardizate prin UML.
Clientul@# !" #%)"(1#2(#(-(6(%>+#) & &(5 #A)+"& #! &1 &B7#?2" %,"+#2(#,&(. 2" #&+!,*-!*&(:#/((-3#3 #$<() (#
)$- )"%"#5%#*-#-*.+&#& 5%"(1#.()#3 #! 1 & #5%#*-#%-*.("#.$. -"7#?,5()%6(%#)5( -"# !" #3 #& 4*5+#) %#
)%& #(-" &%)6($- %>+#3(& )"#)*#*"5(>%"$&*5:#$/ &(-3#, -"&*#%) !"%#$#(-" &/%6%#4&%/()+#AGUI).
Serverul@# !" #,%!(1:#%2" ,"C-3#) & &(5 #3 #5%#)5( -6(7#D&$) ! %>+#) & &(5 #,&(.(" #2(#$<6(- #&+!,*-!*&(5 #
) #!*-"#"&(.(! #0-%,$(#)+"& #)5( -"7#?)) ,"+#*-#-*.+&#.%& #3 #)$- E(*-(#3 #5%#)5( -6(#2(#3 #$<() (#-*#
$/ &+#$#(-" &/%6+#3(& )"+#)+"& #*"(5(>%"$&7
9.1.1. Arhitecturi
?&'(" )"*&%#3 #<%>+#)5( -"-! &1 &#(.,5()+#3$%$*+#"(,*&(#3 #-$3*&(@#)5( -6((#2(#! &1 &- 5 7#?) %!"+#
%&'(" )"*&+#.%(# !" #-*.("+#2(#two-tier.
1
Paradigme de Programare
Laboratorul 9
9.1.2. !"#$#%#&'()*()%#+,-%& .(
?,5()%6((5 #)%& #)$.*-()+#0-"& # 5 #0-"&-$#& 6 %#!%*#,&(-#9-" &- "#A%,5()%6((#)5( -"#2(#! &1 &B#/$5$! !)#
pentru comunicare anumite protocoale: TCP (Transmission Control Protocol) sau UDP (User
I%"%4&%.#D&$"$)$5B7#JKD# !" #*-#,&$"$)$5#<%>%"#, #)$- E(*- #)%& #$/ &+#*-#!)'(.< de date sigur între
3$*+#)%5)*5%"$%& 7#FID#-*# !" #*-#,&$"$)$5#<%>%"#, #)$- E(*- 7#D%)' " #(-3 , -3 -" #3 #3%" #
A3%"%4&%. B#!*-"#"&(.(! #3 #5%#*-#)%5)*5%"$&#)+"& #%5"*5#/+&+#%#! #4%&%-"%#%G*-4 & %#5$%#3 !"(-%6( 7#L+#
,& !*,*- .#)+#$#%,5()%6( #! &1 &#"&(.(" #)+"& #*-#)5( -"#"(.,*5#)*& -"7#I%)+#*-#,%)' "#-*#%G*-4 #5%#
)5( -"#-*#,& %#%& #! -!#!+#/( #"&(.(!#3(-#-$*:#3 $%& ) #(-/$&.%6(%#-*#%&#.%(#/(#)$& )"+#%"*-)(#)C-3#
clientul ar primi-$#5%#$#-$*+#0-) &)%& 7#F-#%!, )"#(.,$&"%-"# !" #)+#.*5" #&$*" & #2(#/(& =%ll-uri sunt
)$-/(4*&%" #!+#-*#,&(. %!)+#,%)' " #FID7
9.1.3. Porturi
;-#4 - &%5:#*-#)%5)*5%"$&#%& #*-#!(-4*&#,$&"#/(>()#,&(-#)%& #! #)$- )" %>+#0-#& 6 %7#D #%) 5#)%5)*5%"$&#,$"#
&*5%#0-!+#.%(#.*5" #%,5()%6((#) #/$5$! !)#& 6 %*%#2(#)%& #- ) !("+#!+#"&(.("+#!%*#!+#,&(. %!)+#,%)' " 7#
D -"&*#%#! #,*" %#/%) #$#3(!"(-)6( #0-"& #,%)' " 5 #)*#3(1 &! #3 !"(-%6((#! #/$5$! !)#porturile. Porturile
!*-"#(3 -"(/()%" #,&(-#-*. & #, #M#$)" 6(#, #)%& #JKD#2(#FID#5 #/$5$! !)#, -"&*#%#"&(.(" #,%)' " #3 #5%#
2(#)+"& #%,5()%6((5 #)$& )" . Acesta se face prin asocierea unui socket la un anumit port. Prin acel
!$)N "#%,5()%6(%#,&(. 2" #"$%" #3%" 5 #3 !"(-%" #,$&"*5*(#& !, )"(17#8((-3#& ,& > -"%" #, #OP#<(6(:#
,$&"*&(5 #1%&(%>+#3 #5%#Q#5%#PRRSR:#3%&#) 5 #.%(#.()(#3 #OQMT#!*-"#& > &1%" 7
2
Paradigme de Programare
Laboratorul 9
Pentru comunicarea prin TCP se pot folosi clasele din pachetul java.net: URL, URLConnection,
Socket 2(#ServerSocket. Pentru comunicare prin UDP se pot folosi clasele: DatagramPacket,
DatagramSocket 2(#MulticastSocket.
9.1.4. URL
URL este prescurtarea pentru Uniform Re!*&) #U$)%"$(# !" #$#& / &(-6+#A%3& !+B#)+"& #$#& !*&!+#0-#
& 6 %7#?) !" #& / &(-6 #-*#!*-"#$<5(4%"$&((#, #(-" &- ":# 5 #,$"#/(#3 #%! . - %#& !*&! #0-#& 6 %*%#5$)%5+7#
;-#V%1%#! #,$%" #)& %#*-#FWU#,$&-(-3#3 #5%#& ,& > -"%& #%<!$5*"+#%!"/ 5@
K5%!%#FWU#$/ &+#*-#! "#3 #. "$3 #,&(-#)%& #! #,$"#$<6(- #(-/$&.%6((#3 !,& $#%-*.("+#%3& !+@
package test;
import java.net.MalformedURLException;
import java.net.URL;
package test;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
3
Paradigme de Programare
Laboratorul 9
String inputLine;
in.close();
}
}
9.1.5. Sockets
K5%! 5 #FWU#2(#FWUK$-- )"($-#$/ &+#. )%-(!. #3 #-(1 5#& 5%"(1#0-%5"#pentru accesul resurselor din
& 6 %7#9-!+:#)C-3#! #3 >1$5"+#$#%,5()%6( #)5( -"-! &1 &# !" #- ) !%&#*-#%)) !#3 #-(1 5#.%(#!)+>*"#5%#
)$.*-()%6(%#, #& 6 %7#;-"&-$#%&'(" )"*&+#)5( -"-! 1 &:#)$.*-()%& %#0-"& #-$3*&(#"& <*( #!+#/( #!"%<(5+@#
nici un set de date n*#"& <*( #!+#/( #,( &3*"#0-"& #3$*+#-$3*&(:#(%&#,%)' " 5 #"& <*( #!+#%G*-4+#5%#
3 !"(-%6( #0-#%) %2(#$&3(- #0-#)%& #%*#/$!"#"&(.(" #3 #5%#!*&!+7
F-#!$)N "#& ,& >(-"+#*-*5#3(-#) 5 #3$*+#)%, " #%5 #*- (#)$- E(*-(#0-"& #3$*+#%,5()%6((#0-#& 6 %7#F-#
!$)N "# !" #5 4%"#3 #*-#-*.+ #,$&":#,*"C-3 %!"/ 5#!+#(3 -"(/() #3%" 5 #3 !"(-%" #%,5()%6( (#& !, )"(1 7#
F-#%!"/ 5#3 #)%,+"#3 #)$- E(*- # !" #$#)$.<(-%6( #0-"& #%3& !%#9D#2(#-*.+&*5#3 #,$&"7
;-#,%)' "*5#G%1%7- "#4+!(.#)5%!%#Socket )%& #(.,5 . -" %>+#*-#%!"/ 5#3 #)%,+"#3 #)$- E(*- 7#D #5C-4+#
aceasta se mai poate folosi clasa ServerSocket:#)%& #0-#%,5()%6((5 #! &1 &#%G*"+#5%#& ) ,"%& %#
)$- E(*-(5$&#%,5()%6((5$&#)5( -"#5%#*-#%-*.("#,$&"7
D&(-#(-!"%-6 5 #!$)N "#)& %" #%"*-)(#)C-3#$#)$- E(*- # !" #!"%<(5("+#! #,$"#"&(.(" #2(#& ) ,6($-%#3%" #)*#
ajutorul stream-urilor.
D -"&*#%#*&.+&(#)*.#! #,$"#"&(.(" #3%" #0-"& #)5( -"#2(#! &1 &:#1$.#*&.+&(#*-# E .,5*#3 #%,5()%6( #
client-! &1 �-#)%& #! &1 &*5#! #)$.,$&"+#)%#*-# )$*:#"&(.(6C-3#. !%G 5 #0-%,$(#)+"& #)5( -":#,*6(-#
prelucrate.
// SimpleServer.java
package test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
4
Paradigme de Programare
Laboratorul 9
try {
serverSocket = new ServerSocket(9999);
} catch (IOException e) {
System.err.println("Could not listen on port: 9999.");
System.exit(1);
}
String inputLine;
while (true) {
try {
inputLine = in.readLine();
out.println("[" + inputLine + "]");
if (inputLine.compareToIgnoreCase("bye") == 0) {
break;
}
} catch (Exception e) {
System.out.println("connection losed: " + e.getMessage());
break;
}
}
System.out.println("closed connection");
out.close();
in.close();
clientSocket.close();
serverSocket.close();
}
}
?,5()%6(%#)5( -"@
// SimpleClient.java
package test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
5
Paradigme de Programare
Laboratorul 9
BufferedReader in = null;
try {
echoSocket = new Socket("localhost", 9999);
out = new PrintWriter(echoSocket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(echoSocket
.getInputStream()));
} catch (UnknownHostException e) {
System.err.println("Could not connect to server");
System.exit(1);
} catch (IOException e) {
System.err.println("Couldn't get I/O for server conection.");
System.exit(1);
}
out.close();
in.close();
stdIn.close();
echoSocket.close();
}
}
X<! &1+.#)+#%) %!"+#%,5()%6( #3 #" !"#%& #*-#.%& #- %G*-!#0-#) %#) #,&(1 2" #*"(5("%" %#!%7#I%)+#%.#
& %5(>%#$#%,5()%6( #)5( -"-server pornind de la acest exemplu, serverul respectiv ar comunica numai cu
un client.
Pentru a permite server-*5*(#!+#%)) ," #.%(#.*5" #)$- E(*-(#)5( -":#"& <*( #!+#& .%&)+.#.%(#0-"C(#)+#
%"C"#%2" ,"%& %#)$- E(*-(5$&#)C"#2(#%#. !%G 5$&#,&(.(" #3 #5%#)5( -6(#- ) !("+#$#%2" ,"%& #%)"(1+7#I #%()(#
se trage )$-)5*>(%#)+# !" #- 1$( #3 #.%(#.*5" #/(& #3 # E )*6( @#)C" #*-*5#, -"&*#/( )%& #)$- E(*- #
)5( -"#2(#0-)+#*-*5#, -"&*#%!)*5"%& %#,$&"*5*(#2(#%)) ,"%& %#3 #-$(#)$- E(*-(7#K 5 #3$*+#<*)5 #3 #
%2" ,"%& #!*-"#(.,5 . -"%" #0-#)5%! #3(/ &(" @
// MultiServer.java
package test;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
6
Paradigme de Programare
Laboratorul 9
try {
serverSocket = new ServerSocket(9999);
} catch (IOException e) {
System.err.println("Could not listen on port: 9999.");
System.exit(-1);
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
String inputLine;
while (true) {
try {
inputLine = in.readLine();
out.println("[" + inputLine + "]");
if (inputLine.compareToIgnoreCase("bye") == 0) {
System.out.println("client went off");
break;
}
} catch (Exception e) {
System.out.println("client diconnected");
break;
}
}
out.close();
7
Paradigme de Programare
Laboratorul 9
in.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
8
Paradigme de Programare
Laboratorul 9
9.2. /(+0
W %5(>%6(#$#(-" &/%6+#4&%/()+#, -"&*#%,5()%6(%#)5( -"#)%& #!+#, &.("+#%5 4 & %#%3& ! (#2(#%#,$&"*5*(#
%,5()%6( (#! &1 &:#(%*,+#)$- )"%& #!+#, &.("+#"&(.(" & %#. !%G 5$&#)*#*2*&(-6+:#,& )*.#%,5()%6((5 #3 #
. !%4 &( #(-!"%-"+7
Rolul serverului pe post de ecou fiind uti5#3$%&#, -"&*#" !":#.$3(/()%6(#%,5()%6(%#! &1 &#%!"/ 5#0-)C"#
. !%G 5 #"&(.(! #3 #*-#)5( -"#!+#%G*-4+#5%#"$6(#) (5%56(#)5( -6(#)$- )"%6(7
K #(.,5()%6((#& >*5"+#3(-#.$3(/()%& %#%-" &($%&+Y#L &1 &*5#"& <*( #!+#)& > #2(#!+#%)"*%5(> > #$#5(!"+#)*#
"$6(#)5( -6(( )$- )"%6(7#Z !%G 5 #"&(.(! #3 #*-#)5( -"#)+"& #"$6(#"& <*( #!+#/( #.%&)%"#0-"&-un mod astfel
0-)C"#!+#! #2"( #3 #)(- #%#/$!"#"&(.(!:#& >*5"+#)+#/( )+&*(#)5( -":#5%#)$- )"%& :#"& <*( #!+#(#! #) %&+#*-#
nume (nick).
?"&(<*(& %#3 #-*. #)5( -6(5$&#)$- )"%6(#0- 5(!"%#3 #, #! &1 &#,& !*,*- #)%#%) !" #-*. #!+#/( #*-() 7#
K5( -"*5#"& <*( #%!"/ 5#!+#0-) &) #!+#! #)$- )" > #,C-+#)C-3#4+! 2" #*-#-*. #)%& #-*#.%(# !" #/$5$!("#
de alt client deja conectat.
X<! &1%6(#)+#" E" 5 #A. !%G 5 B#1 '()*5%" #0-"& #*-#)5( -"#2(#! &1 &#%*#3(1 &! #! .-(/()%6((:#
-*.+&*5#%) !"$&#! .-(/()%6((#)& !)C-3#)*#)C"#)& 2" #)$.,5 E("%" %#%,5()%6( (@#"&(.(" & #-()N:#
refuzare nick, acceptare nick, trimitere mesaj, primire mesaj de la alt client, etc. Putem
(.%4(-%#%) !" #. !%G #)%#, #-(2" #)$. ->(#"&(.(! #3 #*-%#3(-#%,5()%6((#)+"& #) %5%5"+7#?) !" #
comenzi pot fi codificate în mesajele transmise prin prefixarea acestora cu diverse coduri.
D -"&*#%#*2*&%#%) !" #)$3(/()+&(H3 )$3(/()+&(#0-) &)%6(#!+#*-(/$&.(>%6(#3(!,%")'-ul comenzilor
folosind o enumerare a acestor comenzi.
E(!" -6%#*-$&#)5( -6(#3 G%#)$- )"%6(#(.,5()+#-$"(/()%& %#)5( -"*5*(#)%& #! #)$- )" %>+#5%#
*-#.$. -"#3%"#A E(!" -6%#, #)5( -"#%#*- (#5(!" #3 #)5( -6(#)$- )"%6(#, #! &1 &:#(-" &/%6+#
4&%/()+#, -"&*#%/(2%& %#%) !"$&%:#%)"*%5(>%& %#5(!" (#%"*-)(#)C-3#)5( -6((#! #)$- )" %>+#
!%*#3 )$- )" %>+B
"&(.(" & %#. !%G 5$�-#.%!+#)+"& #"$6(#)5( -6((#)$- )"%6(#-*#/%) #%,5()%6(%#"$).%(#
,&%)"()+@#4C-3(6(#*-#.$3#,&(-#)%& #. !%G #,&(1%" #&#,*" %#/(#"&(.(! #)+"& #3(1 &2(#)5( -6(#
A.$3#3 #! 5 )6( #%#)5( -"*5*(:#.$3*5#3 #%/(2%& #3(!"(-)"+#%#3(!)*6((5$&#,&(1%" B
9
Paradigme de Programare
Laboratorul 8
Laboratorul 8
8.1. !"#$%#$#&#'()!#$*+,"#-%-uri)
!"#$%&$'('$)'"*%!*+$)!,-")./0,-"1%+-"+!/,-2/"1)").)*+2/)"1)"3'4-5"procesele 6/" !"#$#%&#%#'#()*!#.
!"#$%"&'"'(')*+$'"',-'".",*))',$*!'",')/'!+$012"&'"$!,-%*)+$*!$")0%'",'"'(')*-2"3!")0&%*1"*!*$"
proces.
Într-+!"#$%&$'("#+,)("'C)'"('/"(+9,)"B/$)"1)").)*+2/)"8!"#'$'9)9="/'$"0/0,)(+9"1)"%#)$'$)"C'"'9%*'"#)"
$D!1"*+'!,)"1/!",/(#+9"#$%*)0%$+9+/"B/)*-$+/"B/$"1)").)*+2/)"#D!-"9'",)$(/!'$)'"'*)0,%$'A
8.1.1. ."#-"#-$/!$01"2!"#-$(2(!$3!"$%#$#&#'()!#4
În Java, fiecare fir de ).)*+2/)"'$)"'0%*/',-"%"/!0,'!2-"'"*9'0)/"Thread.
E./0,-"1%+-"(%1+$/"1)"'"*$)'"+!"B/$"1)").)*+2/)5
F(#9)()!,'$)'"/!,)$B)2)/"Runnable;
Extinderea clasei Thread.
G,D,"/!,)$B'2'"Runnable="*D,"6/"*9'0'"Thread="'+"1)B/!/,-"(),%1'"run()="*'$)"*%!2/!)"*%1+9").)*utat de
B/$+9"1)").)*+2/)A"7)!,$+"'"9'!0'"+!"B/$"1)").)*+2/)"0)"'#)9)'4-"(),%1'"start() a clasei Thread="(),%1-"
*'$)"!+"B'*)"'9,"*)C'"1)*D,"0-"#%$!)'0*-"+!"!%+"B/$"1)").)*+2/)"6/"0-"'#)9)4)"(),%1'"run().
1) !"#!"#$%&%'$('!$)"$"*"+%,'"$-!'&$'.-/"."&0#!"#$'&0"!(","'$1%&/"3
public FirDeExecutieRunnable() {}
@Override
public void run() {
// codul executat de firul de executie
}
2) !"#!"#$%&%'$('!$)"$"*"+%,'"$-!'&$"*0'&)"!"#$+/#4"'$56!"#)3
public FirDeExecutieThread() {}
1
Paradigme de Programare
Laboratorul 8
@Override
public void run() {
// codul executat de firul de executie
}
8.1.2. 50"!"#-$6#701"-"8$-$(2(!$3!"$%#$#&#'()!#
7)!,$+"%#$/",)(#%$'$").)*+2/'"+!+/",H$)'1"0)"#%',)"B%9%0/"(),%1'"sleep(…). Durata pentru care este
8!,$)$+#,"B/$+9"1)").)*+2/)"1)#/!1)"6/"1)"#$)*/4/'",/()$-elor sistemului de operare.
De exemplu:
try {
// se face o pauza de o secunda
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
8.1.3. !"#$%#$#&#'()!#$%#$6!0$9%-#712:
<!"I1')(%!J"$)#$)4/!,-"+!"B/$"1)").)*+2/)"*'$)"0)",)$(/!-"'+,%(',"9'",)$(/!'$)'"'#9/*'2/)/A"K)"%3/*)/"
B/$)9)"I1')(%!J"#+!"9'"1/0#%4/2/'"*)9%$9'9,)"B/$)"1)").)*+2/)"'!+(/,)"0)$C/*//A
G,+!*/"*D!1"0/!&+$)9)"B/$)"1)").)*+2/)"$-('0)"0+!,"*)9)"I1')(%!J"'#9/*'2/'"86/",)$(/!-").)*+2/'A
7)!,$+"'"0),'"+!"B/$"*'"B//!1"I1')(%!J"0)"B%9%0)6,)"(),%1'"setDaemon(true)="8!'/!,)"*'"B/$+9"0-"B/)"
lansat.
2
Paradigme de Programare
Laboratorul 8
8.1.4. .!';(;$%#$<!-)8$-;$(2(!$3!"$%#$#&#'()!#
New Thread
o !"#$%&#'"($)$*+!"'+,($'$%-'!#*$./&#'0$!'1$'$1+#*$!12%-'!#$'$'%#!"#*'3
o 4+$'%#!"($!"'&#$+1$!#$#5#%1"($6+%($+*7*%$6+$8'&'-#-9$:*&1-$0#$#5#%1,*#$#!"#$;<*0=3
Runnable
o Thread-ul este -'+!'"$6+$#5#%1,*#$8&*+$'8#-1-$7#")0#*$start() din clasa Thread.
o >#$'-)%($&#!1&!#-#$0#$!*!"#7$+#%#!'&#$?*$!#$'8#-#'@($7#")0'$run().
o 4+$'%#'!"($!"'&#$1+$:*&$0#$#5#%1,*#$8)'"#$!($#5#%1"#$*+!"&1%,*1+*$!'1$!(-?*$'?"#8"#$&A+01-$
la procesor.
Not Runnable – se p)'"#$'B1+C#$6+$'%#'!"($!"'&#$0'%(D
o >#$'8#-#'@($7#")0'$Thread.sleep(…).
o >#$'8#-#'@($7#")0'$wait() (din clasa object).
o Firul este blocat într-)$)8#&',*#$0#$*+"&'&#E*#?*
Dead
o 4+$'%#'!"($!"'&#$!#$'B1+C#$%A+0$:*&1-$?*-'$"#&7*+'"$#5#%1,*'3
o F+$:*&$0#$#5#%1,*#$nu poate fi oprit din program prin apelarea unei metode (în Java
versiunea 1.0 exista metoda stop() 8#+"&1$'$!#$)8&*$1+$:*&9$0'&$'%#'!"'$'$:)!"$7'&%'"($%'$
fiind deprecated din motive de securitate).
3
Paradigme de Programare
Laboratorul 8
8.1.7. 6'$7%*!$'!(#*#%(,%$(-'('.'+#/%'
Pentru ca un fi&$0#$#5#%1,*#$!($!#$"#&7*+#$"*#$%'$7#")0'$run() !(-?*$"#&7*+#$#5#%1,*'3$ 5*!"($0)1($
7#")0#$8#+"&1$"#&7*+'&#'$1+1*$:*&$0#$#5#%1,*#D
8.1.8. 8$%1$%29/%&'(-'('.'+#/%'
J&*)&*"(,*-#$0#$#5#%1,*#$'-#$1+1*$"/&#'0$!#$!"'2*-#!%$-'$%&#'&#'$1+1*$+)1$:*&$0#$#5#%1,*#$?*$!#$8)"$!%/*72'$
pe parcursul programului folosind metoda setPriority(…) a clasei Thread.
4+$C#+#&'-9$%A+0$#5*!"($7'*$71-"#$:*&#$0#$#5#%1,*#$%1$8&*)&*"(,*$0*:#&*"#9$!1+"$8&#:#&'"#$:*&#-#$%'&#$'1
8&*)&*"'"#$7'*$7'	$0'&$+1$#5*!"($+*%*$)$C'&'+,*#$6+$'%#!"$!#+!$0#)'&#%#$!*!"#71-$0#$)8#&'&#$8)'"#$
interveni în alocarea cuantelor de timp.
J&*)&*"'"#'$0#$#5#%1,*#$#!"#$1+$+17(&$6+"&#C$%18&*+!$6+"&#$KLMNJHLOHL.P$?*$KQRNJHLOHL.P9$
<'-)'&#'$*78-*%*"($:**+0$MOHKNJLOHL.P3$Q%#!"#$%)+!"'+"#$!"'"*%#$!1+"$0#:*+*"#$6+$%-'!'$Thread:
4
Paradigme de Programare
Laboratorul 8
8.2. Sincronizarea
S*&#-#$0#$#5#%1,*#$%)71+*%($6+"&#$#-#$8&*+$*+"#&7#0*1-$1+)&$&#!1&!#$%)71+#$I%A781&*T3$Q%#!"$-1%&1$
8)'"#$0'$+'?"#&#$-'$*+"#&:#&#+,'$:*&#-)&$0#$#5#%1,*#$!'1$-'$#&)&*$0#$%)+!*!"#+,($'$7#7)&*#*3 Pentru a se
evita aceast( situa,ie se poate folosi sincronizarea metodelor sau sincronizarea blocurilor.
5
Paradigme de Programare
Laboratorul 8
8.3. Exemplu
import java.io.IOException;
@Override
public void run() {
while (!stopProgram) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
count++;
}
}
8.4. 6'79
Realiza,i o aplica,*#$%#$<'$8#&7*"#$%*"*&#'$!*71-"'+($0*+$U$:*?iere text (cuvânt cu cuvânt) ?i scrierea
%1<*+"#-)&$8#$7(!1&($%#$!1+"$%*"*"#$6+"&-un al patrulea fi?ier. Pentru fiec'&#$%*"*&#$0*+$:*?ier se va folosi
%A"#$1+$:*&$0#$#5#%1,ie, iar scrierea cuvintelor se va face sincronizat.
6
Paradigme de Programare
Laboratorul 7
Laboratorul 7
7.1. Swing
!"#$%&"'("&)*#+,-%*".*/*"0(/(!(*"0$!"'("1!"'("%*$"&,&2)*-34"&-,5-*%*#,-$$"*2"1!'(&2#"63"-(*)$7(7("'3"
*&)$'*8$$)("-(*)$7*#("'2"9:;"(-*2"+,*-#(")(!#("$*-"6(#2)"0("',%&,!(!#(",+(-$#"!2"&(-%$#(*"-(*)$7*-(*"
2!,-"$!#(-+(8("',%&)$'*#(<"=-(&#"2-%*-(4">2!"?$'-,6@6#(%6"1%&-(2!3"'2"*)8$"&*-#(!(-$"*2"'-(*#","!,23"
)$A-3-$(B"JFC (Java Foundation ClassesC<"D*-#("0$!"*'(*6#3")$A-3-$("!,23"(6#("E$"6(#2)"0("',%&,!(!#("
Swing<"9'(6#"6(#"!,2"0("',%&,!(!#("FG"'2&-$!0(","6(-$("0("',%&,!(!#("!,$"E$","6(-$("0("',%&,!(!#("
care „înl,'2$(6'H"'*"+2!'8$,!*)$#*#("',%&,!(!#("9:;<">I$!5",+(-3"*)#(-!*#$/("&(!#-2"#,*#("
',%&,!(!#()("9:;"E$"62&,-#3"#,*#("'*&*A$)$#38$)("6(#-2)2$",-$5$!*)"0("',%&,!(!#(")*"'*-("*0*253"
%2)#("*)#()(<"=(E$"',%&,!(!#()(",-$5$!*)("9:;"*-"#-(A2$"63"!2"%*$"+$("!('(6*-(4 o serie de concepte
0("A*73"9:;"-3%J!"/*)*A$)("E$"#-(A2$("1!8()(6(B"%*!*5(-$$"0(")*@,2#4"6$6#(%2)"0("',!#-,)"*)"
(/(!$%(!#(),-"E$"6$6#(%2)"0("0(6(!*-(<"9E*0*-4">I$!5-ul este construit pe bazele nucleului AWT.
Denumirea !,$),-"')*6("0$!">I$!5"&-,/$!"0$!"!2%()("')*6(),-"',-(6&2!73#,*-("0$!"9:;4")*"'*-("6("
*0*253"&-(+$K2)"L.L4"(K'(&8$("+3'J!0"')*6*".',%A,M,K"'*-("1!),'2$(E#("')*6*"NO,$'(<"P2!'8$,!*)$#38$)("
0$!"')*6()("9:;"6("-(536(6'"E$"1!"',-(6&,!0(!#()("0$!">I$!54"'2"(K'(&8$*"')*6($".Q$6#4"*)"'3-($"
comportament este total diferit de cel al clasei originale List.
D(")J!53"1!),'2$-(*"',%&,!(!#(),-"0("A*73"0$!"9:;">I$!5",+(-3"E$"%2)#("',%&,!(!#("!,$B
1
Paradigme de Programare
Laboratorul 7
JPasswordField
Câmp pentru introducerea
&*-,)($4",&(-*8$$"5(!"'2#"6*2"',&@"
nu sunt permise.
!"#$%&'"()*( +,*$-.%&'"
N,!#-,*)("&(!#-2"*+$E*-("E$"
editare text cu atribute multiple
(cum ar fi HTML sau RTF).
JSpinner
Permite selectarea unei valori
dintr-un set predefinit ordonat de
/*),-$<"R+(-3"635(8$"&(!#-2"
/*),*-(*"2-%3#,*-("6*2"'(*"
*!#(-$,*-3<"S*),-$)("&-(0(+$!$#("
pot fi un vector de String-uri, un
6(#"0("!2%(-("6*2","0*#3<"
JToggleButton
Buton special care atunci când
(6#("*&36*#"-3%J!("*&36*#<"
JSlider
D(-%$#("2#$)$7*#,-2)2$"63"*)(*53","
valoare din mai multe valori
*+$E*#("&(","5-$)3<"
JProgressBar
9+$E(*73"&-,5-(62)"2!($"
*'#$/$#38$<"F!()(",&8$2!$"&(-%$#"
*+$E*-(*"2!2$"#(K#"6#*#$'"6*2"*"
(/,)28$($"&-,'(!tuale.
JFormattedTextField
Permite introducerea a diverse
texte formatate: valori numerice,
numere de telefon sau date.
JTable
2
Paradigme de Programare
Laboratorul 7
D(-%$#("*+$E*-(*"2!2$"6(#"0("
valori într-,"6#-2'#2-3"
A$0$%(!6$,!*)3<"
JTree
D(-%$#("*+$E*-("2!,-"0*#("
ierarhice.
JToolTip
D-$!"*'(*6#3"',%&,!(!#3"#,*#("
',!#-,*)()(">I$!5"&,#"*+$E*"
$!+,-%*8$$"2#$)("&-$!"#(K#("&,&-
up.
JToolBar
9T2#3")*"'-(*-(*"0("#,,)A*--uri ce
&,#"+$"$!')26("1!",-$'("+(-(*6#-3<"
JRadioButtonMenuItem E$"
JCheckBoxMenuItem
Componente suplimentare la
setul de componente legate de
meniuri.
JSeparator
Linia de separare dintr-un meniu
(6#("*'2%","',%&,!(!#3"
6(&*-*#3"'("&,*#("+$"+,),6$#3"E$"1!"
afara meniurilor.
3
Paradigme de Programare
Laboratorul 7
JDesktopPane E$"JInternalFrame
Pereche de componente ce aju#3"
)*"0(7/,)#*-(*"*&)$'*8$$),-"?=G"
(Multiple Document Interface).
JOptionPane
9T2#3")*"'-(*-(*"-*&$03"*"
ferestrelor pop-2&"'2"',!8$!2#"
variabil.
JColorChooser
9T2#3")*"6()('#*-(*"2!($"'2),-$"1!"
diverse moduri.
JSplitPane
9T2#3")*"&)*6*-(*"%*$"%2)#,-"
componente într-,"+(-(*6#-3"E$"
&(-%$#("2#$)$7*#,-2)2$"63"
controleze cât de mult poate
/(0(*"0$!"+$('*-("',%&,!(!#3<"
4
Paradigme de Programare
Laboratorul 7
JTabbedPane
N,%&,!(!#3"'("6("',%&,-#3"'*"
un container cu un CardLayout
%*!*5(-"E$"'*-(",+(-3"*2#,%*#"6$"
tab-uri pentru ce permit
2#$)$7*#,-2)2$"63"*)(*53"1!#-("
card-uri.
D(!#-2"*",A8$!("%*$"%2)#("0(#*)$$"0(6&-("#,*#("',!#-,*)()("E$"%,02-$"0("+,),6$-(4"&2#(8$"
2-%3-$"tutorialele de la Sun.
>2!"*"$!#-,026"1!")$A-3-$$)(".*/*"%('*!$6%2)"0("',!#-,)"*)"(/(!$%(!#(),-"A*7*#"&("0()(53-$","
0*#3"'2")*!6*-(*".=U"V<V"E$".*/*M(*!6<
D(!#-2"*"'-(*","*&)$'*8$("'*-("-36&2!0("',-(6&2!73#,-")*"*!2%$#("(/(!$%(!#("W*&363-$"0( taste,
6*2"A2#,*!(4"$!#-,02'(-$"0("#(K#XC"62!#"!('(6*-$"Y"&*E$B
1. =(+$!$-(*"2!($"')*6("'*-("63"$%&)(%(!#(7("$!#(-+*8*"Listener ',-(6&2!73#,*-("
evenimentului ce trebuie tratat.
2. N-(*-(*"2!($"$!6#*!8("*"*'(6#($"')*6(<"
3. !-(5$6#-*-(*"$!6#*!8($")$6#(!(-")*",A$('#2)"'("/*"5(!(-*"(/(!$%(!#2)"'("#-(A2$("#-*#*#<"
ZK(%&)2"6$%&)2"&(!#-2"#-*#*-(*"(/(!$%(!#2)2$"5(!(-*#")*"*&36*-(*"2!2$"A2#,!B
Definirea Listener-ului
RA6(-/3%"'3"&*-#(*"(6(!8$*)3"*#2!'$"'J!0"/-(%"63"',!#-,)3%"',%&,-#*%(!#2)"2!2$",A$('#"W1!"
'*72)"!,6#-2"*"2!($"',%&,!(!#(">I$!5C"(6#("63"$0(!#$+$'3%"'("(/(!$%(!#("&,*#("5(!(-*"*'()"
,A$('#4"'*-("0$!#-("*'(6#(*"!("$!#(-(6(*73"E$"'("$!#(-+(8([%(#,0("#-(A2$("$%&)(%(!#*#("&(!#-2"*"
putea controla acele evenimente.
N-(*-(*"2!($"$!6#*!8("*"Q$6#(!(--ului definit
5
Paradigme de Programare
Laboratorul 7
ActionListener actionListener = new MyActionListener();
R"&-*'#$'3"0(6"1!#J)!$#3"1!"',!#-,)2)"(/(!$%(!#(),-"(6#("+,),6$-(*"')*6(),-"$!#(-!("*!,!$%(4"
*6#+()"&2#(%"',%A$!*"&-$%$$"\"&*E$B
!-(5$6#-*-(*"$!6#*!8($"Q$6#(!(-"
N,!6$0(-J!0"'3"*/(%"$!6#*!8$*#"2!"A2#,!B
&2#(%"0()(5*"$!6#*!8*"Q$6#(!(-"63"H*6'2)#(H"(/(!$%(!#2)"A2#,!2)2$B
btnPressMe.addActionListener(actionListener);
P,),6$!0"')*6()("$!#(-!("*!,!$%(4"&2#(%"',%A$!*"#,8$"'($"Y"&*E$B
btnPressMe.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent actionEvent) {
System.out.println(”Button pressed”);
}
});
S,%"',!6#-2$","*&)$'*8$("'*-("63",+(-(","+2!'8$,!*)$#*#("*6(%3!3#,*-("*&)$'*8$($"N*)'2)*#,-"0$!"
Windows.
package demo;
RA6(-/3%"'3"6("+*'(","6$%&)3"$!6#*!83"*"')*6($"N*)'4"'((*"'("1!6(*%!3"'3"#,*#("6(#3-$)("
+(-(6#-($"*&)$'*8$($")("/,%"+*'("1!"',!6#-2'#,-2)"*'(6#($"')*6(<
Prima setare ar fi titlul ferestrei. Aceasta se poate face prin apelul constructorului cu
parametrul title 0$!"')*6*"0("A*73B
super("Calculator");
6
Paradigme de Programare
Laboratorul 7
P3'J!0"2!"*&()")*"',!6#-2'#,-2)"')*6($"0("A*734"*'(*6#3"$!#-2'8$2!("#-(A2$("63"+$("&-$%*"0$!"
corpul constructorului clasei Calc.
!"%,0"$%&)$'$#4","+(-(*6#-3"'-(*#3"&-$!"')*6*".P-*%("6("*6'2!0("*#2!'$"'J!0"1!'(-'3%"63","
1!'O$0(%<" !"'*72)"0("+*83"!2"!("',!/$!("*'(6#"',%&,-#*%(!#"E$"1)"/,%"6'O$%A*B
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
]("*6$52-3%"'*"0$%(!6$2!(*"+(-(6#-($"!2"/*"+$"%,0$+$'*#3"0("'3#-("2#$)$7*#,-"W!2"*-"*/(*"!$'$","
2#$)$#*#("*'(*6#3"-(0$%(!6$,!*-(C"E$"*&()3%"%(#,0*"&*'^WC"'*-("0$%(!6$,!(*73"+(-(*6#-*")*"
0$%(!6$2!(*"!('(6*-3"&(!#-2"*"'2&-$!0("#,*#("',%&,!(!#()(B
pack()
setResizable(false);
=,-$%"'*"+(-(*6#-*"63"*&*-3"1!"'(!#-2)"('-*!2)2$B
setLocationRelativeTo(null);
G%&)$'$#"+(-(*6#-*"(6#("$!/$7$A$)34"&2#J!0"*6#+()"63","+*'(%"/$7$A$)3"0,*-"*#2!'$"'J!0"*%"
#(-%$!*#"6(#3-$)(B
setVisible(true);
=*'3"-2)3%"*'2%"*&)$'*8$*"/,%"*/(*","+(-(*6#-3"5,*)3"'*-("*&*-("1!"%$T),'2)"('-*!2)2$<
!"/(0(-(*"'-(3-$$"',!#-,*)(),-"E$"*E(73-$$"),-"1!"
+(-(*6#-3"5-2&3%"controalele necesare conform
'O(!*-(),-"0$!"+$52-3<
;,*#("*'(6#("6(#3-$")("/,%"5-2&*"1!"+2!'8$*
&("'*-(","*&()3%"1!"',!6#-2'#,-<
public Calc() {
super("Calculator");
setDefaultCloseOperation(JFrame.EXIT_ON_
CLOSE);
initComponents();
pack();
setResizable(false);
setLocationRelativeTo(null);
setVisible(true);
}
7
Paradigme de Programare
Laboratorul 7
!*$!#("0("*"*0325*",-$'("',%&,!(!#3"!("*6$52-3%"'3"+(-(*6#-*"1!0(&)$!(E#("',!0$8$$)("0,-$#(<"
>(#3%"',!#*$!(--ul +(-(6#-($"*6#+()"1!'J#"63"(K$6#("2!"6&*8$2"1!#-("',%&,!(!#("E$"%*-5$!(*"
ferestrei ferestrei:
D-$%*"',%&,!(!#3"6(#*#3"(6#("=$6&)*@-2)<"?*$"1!#J$"0(')*-3%"%(%A-2)"1!"'*0-2)"')*6($
$*-"*&,$"+*'(%"6(#3-$)("!('(6*-(B"+*'(%"#(K#+$()0-2)"!((0$#*A$)"0*-"*/(%"5-$T3"'*"+2!0*)2)"63"
-3%J!3"*)A4"*)$!$(%"#(K#2)")*"0-(*&#*<"G%&)$'$#4".P-*%("*-("'*"%*!*5(-"0(")*@,2#","$!6#*!83"
M,-0(-Q*@,2#<"90325*#"#(K#+$()0-ul în partea NORTH:
int number() {
return number;
}
8
Paradigme de Programare
Laboratorul 7
String displayText() {
return displayText;
}
Commands(String displayText) {
this(displayText, -1);
}
@SuppressWarnings("serial")
public class CommandButton extends JButton {
;'$5&*$!"5&:.%.62&)'")6!+&'%)6+&*"/!,$&)&<*.*$%)<&-$!.)/"%"&)*%2')=2"2>&?)2&@/!A2&"#!,)B"5&
într-$/&("'!.,&!.)!"&!2*$,2%"&4"&-$!.)/"C&*"/!,$&)&',")&12&)4+$B)&-$!.)/"%"&)$!.5)!>
D,25"%"&E&-$!.)/"&:)'&*),!"&42/&*,25$%&B,$*C&'./:.,5&B,$*+,22&:+'$!"&)/!",2.,>&;'"6!")&(.,&:2&
)4+$B)!"&@/!,-un panel:
// group 1
JPanel pnlGroup1 = new JPanel();
for (int btnIndex = 0; btnIndex < 3; btnIndex++) {
CommandButton btn = new CommandButton(cmdButtons[btnIndex]);
btn.addActionListener(this);
pnlGroup1.add(btn);
}
add(pnlGroup1, BorderLayout.EAST);
9
Paradigme de Programare
Laboratorul 7
// group2
JPanel pnlGroup2 = new JPanel(new GridLayout(4, 5, 5, 5));
for (int btnIndex = 3; btnIndex < cmdButtons.length; btnIndex++) {
CommandButton btn = new CommandButton(cmdButtons[btnIndex]);
btn.addActionListener(this);
pnlGroup2.add(btn);
}
add(pnlGroup2, BorderLayout.SOUTH);
I-6",(+5&'+&Listener-ul evenimentului Action al acestor butoane este chiar clasa Calc. Prin
$,5),"&)'")6!)&!,"-$2"&6+&25*%"5"/!"H"&2/!",:)=)&ActionListener 12&5"!.4)&)'"6!"2)>
D"/!,$&)&*",52!"&)%!",/),")&@/!,"&42(",6"&25*%"5"/!+,2&)%"&%.B2'22C&(.5&4":2/2&5)2&@/!A2&.&
2/!",:)=+9
L.5&',")&)*.2&.&25*%"5"/!),"&4":)$%!&)&)'"6!"2&2/!",:"="9
public DefaultCalcModel() {
currentRezult = 0;
currentValue = 0;
}
10
Paradigme de Programare
Laboratorul 7
currentValue = 0;
currentRezult = 0;
break;
}
}
}
M/&'%)6)&J)%'&:.%.625&.&2/6!)/=+&)&)'"6!"2&'%)6"&')&5"5-,$& 4"&:)*!&:.%.625&.&,":",2/=+&'+!,"&
2/!",:)=+09
M/&'./6!,$'!.,&2/2=2)%2H+5&,":",2/=)&'+!,"&2/!",:)=+&'$&.&2/6!)/=+&)&$/"2&'%)6"&'"&25*%"5"/!")H+&
)'")&2/!",:)=+& '%)6)&4":)$%!&@/&)'"6!&')H09
;'$5&*$!"5&25*%"5"/!)&12&5"!.4)&N26!"/",-ului:
3.%.62/4&.&,":",2/=+&'+!,"&2/!",:)=+&*$!"5&:.),!"&$1.,&6+&:.%.625&%)&/"(.2"&.&)%!+&
25*%"5"/!),">&O"*),),")&*+,=22&(2H$)%"&4"&*),!")&4"&%.B2'+&*",52!"&')&'"%"&P&*+,=2&6+&*.)!+&:2&
modificate în mod independent.
7.3. !"#
Q")%2H)=2&)*%2')=2)&4"!)%2)!+&@/&"#"5*%$%&)/!",2.,&
J.5*%"!)=2&@/&'%)6)&R":)$%!J)%'?.4"%&!,)!),")&'.5"/H2%.,&("/2!"&42/&:,./!>&
J.5*%"!)=2&-$!.)/"%"&42/&:",")6!,+&'$&'"%"&%"B)!"&4"&.*",)=22%"&'$&?"5.,2)& 12&.:",2=2&
suportul pentru acestea în model):
MS – 6)%(")H+&@/&5"5.,2"&()%.),")&'$,"/!+
M+ - )4)$B+&()%.),")&'$,"/!+&%)&()%.),")&42/&5"5.,2"
MR – 6"!")H+&()%.),")&42/&5"5.,2"&')&()%.),"&'$,"/!+
MC – ,"6"!")H+&5"5.,2)
label – ):21")H+&?&)!$/'2&'A/4&"6!"&.&()%.),")&,"=2/$!+&@/&5"5.,2"&
11
Paradigme de Programare
Laboratorul 6
Laboratorul 6
6.1. !"#$%&'&()"*+*,&"-$.(/01
Termenul de UI !"#$%&'(#$)*+#,%#"(#%!'%(#$-#'%.*$/%+#%)*+#%$#)#$&$#%.*%(0*(#%-01*.&(23&.#%1#%
+0-!'&+*$#%1&'($#%!'%4$0/$*-%5&%!(&.&6*(0$&&%*+#"(!&*7%8'(#$)*3*%!(&.&6*(0$%3&'#%9'%-*$#%4*$(#%1#%+##*%+#%
!(&.&6*(0$!.%40*(#%:#1#*7%;+#*"(*%#"(#%&'(#$)*3*%:&6!*.2<%GUI (Graphical User Interface).
;4.&+*3&&.#%5&%*44.#(-!$&.#%=*:*%&'(#$*+3&0'#*62%1#%0>&+#&%4$&'%&'(#$-#1&!.%!'#&%&'(#$)#3#%?@87%A'%*+#"(%
"#'"%=*:*%0)#$2%!'%"#(%+0-4.#(%1#%+0-40'#'(#B%/$!4*(#%9'%4*+C#(#.#%AWT (Abstract Window
Toolkit). În locul componentelor AWT, Sun r#+0-*'12%)0.0"&$#*%'0&.0$%+0-40'#'(#%?@8%1&'%
pachetele JFC (Java Foundation Classes)-Swing7%;+#"(#*%1&'%!$-2%9'"2%*!%.*%>*62%+0-40'#'(#.#%
AWT, prin urmare le vom studia pe acestea mai întâi.
D0'($0*.#.#%1#%>*62%4$&'%+*$#%!(&.&6*(0$!.%40*(#%&'(#$*+3&0'*%+!%*4.&+*3&*%"!'(<%Button, Checkbox,
Choice, List, MenuItem, TextField7%DE'1%!'!.%1&'%*+#"(#%+0'($0*.#%#"(#%*+(&:*(B%*+#"(*%*:#$(&6#*62%
*4.&+*3&*%4$&'($-un eveniment7%F>&#+(!.%+0'(*&'#$%+#%+0'3&'#%+0'($0.!.%$#"4#+(&:%40*(#%$2"4!'1#%
"0.&+&(2$&& !(&.&6*(0$!.!&%$#+#4(E'1%#:#'&-#'(!.%#-&"%1#%+2($#%+0'($0.%5&%&-4.#-#'(E'1%$2"4!'"!.%9'%
cadrul unei metode action.
Un rol important îl au clasele container, subclase ale clasei Container. Dialog, FileDialog 5&%Frame
0)#$2%"!40$(%4#'($!%$#*.&6*$#*%)#$#"($#.0$%+#%40(%+0'3&'#%*.(#%+0-40'#'(#B%Panel *G!(2%.*%/$!4*$#*%
componentelor dintr-0%60'2%*%!'#&%)#$#"($#%#H&"(#'(#B%&*$%ScrollPane *G!(2%.*%*)&5*$#*%+0-40'#'(#.0$%
-*$&%4#%0%"!4$*)*32%$#"($E'"27
1
Paradigme de Programare
Laboratorul 6
I#%.E'/2%*+#"(#%+0-40'#'(#B%;JK%-*&%+!4$&'1#%0%"#$&#%1#%+.*"#%+*$#%*G!(2%.*%1#"#'*$#%5&%.*%+0'($0.!.%
evenimentelor.
În modelul conceput în versiunea 1.1, evenimentele sunt generate de surse. Unul sau mai multe
obiecte (listeners,%40(%*"+!.(*%#:#'&-#'(#%1#%!'%*'!-&(%(&4%1#%.*%0%*'!-&(2%"!$"27%I$0/$*-*(0$!.%*$#%
astfel puterea de a delega responsabilitatea controlului even&-#'(#.0$%0$&+2$0$%0>&#+(#%+*$#%
&-4.#-#'(#*62%&'(#$)#3#.#%40($&:&(#7%L:#'&-#'(#.#%40(%)&%*"()#.%+0'($0.*(#B%&*$%+E'1%#"(#%'#+#"*$%#.#%40(%
)&%5&%/#'#$*(#7
- &-4.#-#'(*$#%&'(#$)#3#&%40($&:&(#%4#'($!%(&4!.%1#%#:#'&-#'(#%*"+!.(*(<
- înregistrarea ca obiect de control pentru evenimentele e un anumit tip ce pot fi emise de anumite
componente:
aComponent.addActionListener(myListenerInstance);
- &-4.#-#'(*$#*%-#(01#.0$%1#+.*$*(#%1#%&'(#$)*32% $#*+3&*%.*%#:#'&-#'(#.#%$#+#4(*(#,<
;+#"(%-01#.%1#%#:#'&-#'(#%#"(#%).#H&>&.%5&%4!(#$'&+%9'%*+#.*5&%(&-47%F$&+#%'!-2$%1#%0>&#+(#%.&"(#'#$%
40(%*"+!.(*%0$&+#%)#.%1#%#:#'&-#'(#%1#%.*%0$&+#%)#.%1#%"!$"27
2
Paradigme de Programare
Laboratorul 6
M*G0$&(*(#*%&'(#$)#3#.0$%.&"(#'#$%;JK% -*&%4!3&'%;+(&0'N&"(#'#$,%+0'3&'%-*&%-!.(%1#%0%-#(0127%O#5&%
*1#"#0$&B%4#'($!%*%&-4.#-#'(*%)!'+3&0'*.&(23&.#%10$&(e avem nevoie doar de 1~2 metode dintre acestea,
(0(!5&%+.*"*%+*$#%&-4.#-#'(#*62%&'(#$)*3*%$#"4#+(&:2%($#>!&#%"2%0)#$#%&-4.#-#'(2$&%4#'($!%(0*(#%
-#(01#.#%&'(#$)#3#&B%+0$4!$&.#%*+#"(0$%-#(01#%)&&'1%1#%0>&+#&%.2"*(#%/0*.#7%I#'($!%*%#:&(*%*+#"(#%40$3&!'&%
de c01%&'!(&.#B%;JK%0)#$2%+E(#%0%+.*"2%Adapter 4#'($!%)&#+*$#%&'(#$)*32%+!%-*&%-!.(%1#%0%-#(0127%
;+#"(#%+.*"#%;1*4(#$%0)#$2%&-4.#-#'(2$&%:&1#%4#'($!%(0*(#%-#(01#.#%&'(#$)#3#&%+0$#"4!'62(0*$#7%F%
+.*"2%+*$#%1#$&:#*62%1&'($-!'%*1*4(#$%'!%-*&%#"(#%0>.&/*(2%"2%&-4.#-#'(#6#%(0*(#%-#(01#.#%&'(#$)#3#&%
implementate de acel adapter.
I$0>.#-#%9'%)0.0"&$#*%+.*"#.0$%*1*4(#$%40(%*42$#*%*(!'+&%+E'1%+.*"*%.&"(#'#$%($#>!&#%"2%-*&%1#$&:#6#%5&%
*.(2%+.*"2% 1#%0>&+#&%;44.#(%"*!%P$*-#,B%1#0*$#+#%.&->*G!.%=*:*%'!%4#$-&(#%-05(#'&$&.#%multiple.
Q0.!3&*%9'%*+#"(%+*6%#"(#%)0.0"&$#*%!'#&%+.*"#%&->$&+*(#% &''#$%+.*"",%+*$#%"2%#H(&'12%+.*"*%*1*4(#$%10$&(2%
$#:#1#3&%1#(*.&&%9'%"#+3&!'#*%Clase imbricate).
O*+2%'!%"#%1#+.*$2%+.*"*%&->$&+*(2%+*%)&&'1%"(*(&+2%*(!'+&%*+#*"(*%#"(#%!'%-#->$!%*.%+.*"#&%#H(#$'#%5&%
*$#%*++#"%.*%4*$*-#($&&%4$&:*3&&%*&%*+#"(#&*7%O#%*"#-#'#*B%:*$&*>&.#.#%.0+*.#%40(%)&%*++#"*(#%1#%+2($#%0%
+.*"2%*'0'&-2%1*+2%*+#"(#*%"!'(%+*.&)&+*(#%+!%-01&)&+*(0$!.%final.
""'/'$%&.!01&12#(3!1!,&*24!#$5+#,*)4!('2)*)#,4
public class MyApp extends Frame {
class MyAdapter extends MouseAdapter {
public void mouseClicked(MouseEvent e) {
""*,-#.(#
}
}
…
anObject.addMouseListener(new MyAdapter());
…
}
""'/'$%&.!01&12#(3!1!,&*24!*(1(#$4
public class MyApp extends Applet {
…
anObject.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
""*,-#.(#
}
}
…
}
3
Paradigme de Programare
Laboratorul 6
Action Adjustment Component Container Focus Item Key Mouse MouseMotion Text Window
Listener Listener Listener Listener Listener Listener Listener Listener Listener Listener Listener
Component Container Focus Key Mouse MouseMotion Window
Adapter Adapter Adapter Adapter Adapter Adapter Adapter
actionPerformed
adjustmentValueChanged
componentHidden
componentMoved
componentResized
componentShown
componentAdded
componentRemoved
focusGained
focusLost
itemStateChanged
keyPressed
keyReleased
keyTyped
mouseClicked
mouseEntered
mouseExited
mousePressed
mouseReleased
mouseDragged
mouseMoved
textValueChanged
windowClosed
windowClosing
windowDeactivated
windowDeiconified
windowIconified
Button X X X X X X Button
Canvas X X X X X X Canvas
Checkbox X X X X X X X Checkbox
Checkbox Checkbox
X
MenuItem MenuItem
Choice X X X X X X X Choice
Component X X X X X X Component
Container X X X X X X X Container
Dialog X X X X X X X X Dialog
Frame X X X X X X X X Frame
Label X X X X X X Label
List X X X X X X X List
MenuItem MenuItem
Panel X X X X X X X Panel
Scollbar X X X X X X X Scollbar
ScrollPane X X X X X X X ScrollPane
TextArea X X X X X X X TextArea
Text Text
X X X X X X X
Component Component
TextField X X X X X X X TextField
Window X X X X X X X X Window
4
Paradigme de Programare
Laboratorul 6
6.1.3. Layouts
Componentele dintr-!'%+0'(*&'#$%;JK%40(%)&%*5#6*(#%5&%*'+0$*(#%9'%1&:#$"#%-01!$&B%*(E(%9'($#%#.#B%+E(%
5&%)*32%1#%+0'(*&'#$!.%9'%+*$#%"#%*).27%D0'($0.!.%*+#"(0$%-01!$&%1#%406&3&0'*$#%"#%40*(#%)*+#%+!%*G!(0$!.%
!'0$%+.*"#%+*$#%&-4.#-#'(#*62%&'(#$)*3*%LayoutManager. Fiecare container are un astfel de manager
&-4.&+&(% #H7%I*'#.<%).0R.*S0!(B%P$*-#<%T0$1#$N*S0!(,7%O*+2%*+#"(%-*'*/#$%&-4.&+&(%'!%#"(#%40($&:&(%
+!%+#$&'3#.#%+0'(*&'#$!.!&%*+#"(%.*S0!(%40*(#%)&%!50$%"+C&->*(<
aContainer.setLayout(new CardLayout());
BorderLyout
CardLayout
;G!(2%.*%*)&5*$#*%*%10!2%"*!%-*&%-!.(#%+0-40'#'(#%"*!%/$!4!$&%1#%+0-40'#'(#%+*$#%"!'(%
*)&5*(#%.*%-0-#'(#%1&)#$&(#%9'%*+#.*5&%"4*3&!7%I#'($!%*.#/#$#*%W+*$1!.!&X%*)&5*(%.*%!'%-0-#'(%
dat se po(%4*$+!$/#%9'%0$1&'#%+*$1!$&.#%"*!%"#%40*(#%"4#+&)&+*%!'!.%*'!-#%1!42%!'%'!-#7%
I#'($!%*12!/*$#*%+0-40'#'(#.0$%9'($-!'%+0'(*&'#$%+*$#%)0.0"#5(#%!'%*"()#.%1#%-*'*/#$%"#%
)0.0"#5(#%1#%*"#-#'#*%-#(01*%*11%+!%Y%4*$*-#($&B%4$&-!.%4$#+&6*'1%'!-#.#%+*$1!.!&7%
FlowLayout
;5#*62%+0-40'#'(#.#%9'%0$1&'#%1#%.*%"(E'/*%.*%1$#*4(*B%($#+E'1%.*%!'%$E'1%'0!%*(!'+&%+E'1%"#%
&-4!'#7%N*%+$#*$#*%-*'*/#$!.!&%"#%40*(#%"4#+&)&+*%5&%*.&'&#$#*%+0-40'#'(#.0$%4#%)&#+*$#%$E'1B%
implicit acestea fiind centrate.
GridLayout
;)&5#*62%(0*(#%+0-40'#'(#.#%1#%1&-#'"&!'&%#/*.#%5&%9'+*1$*(#%9'($-0%"($!+(!$2%-*($&+&*.2%+!%
'!-2$!.%1#%.&'&&%5&%1#%+0.0*'#%"4#+&)&+*(7%N*%+$#*$#*%-*'*/#$!.!&%"#%"4#+&)&+*%+#.#%10!2%
1&-#'"&!'&%*.#%-*($&+#&B%-2+*$%!'*%1&'($#%#.#%($#>!&'1%"2%)&#%0>.&/*(0$&!%1&)#$&(2%1#%:*.0*rea 0.
GridBagLayout
L"(#%+#.%-*&%).#H&>&.%5&%-*&%+0-4.#H%.*S0!(%-*'*/#$%;JK7%D0-40'#'(#.#%"!'(%*5#6*(#%4#%0%
"($!+(!$2%-*($&+&*.2B%*:E'1%40"&>&.&(*(#*%"2%"#%9'(&'12%4#%-*&%-!.(#%.&'&&%"*!%+0.0*'#7%N&'&&.#%5&%
+0.0*'#.#%'!%-*&%*!%(0*(#%*+##*5&%1&-#'"&!'#B%1#+&%'&+&%+#.!.#.#%'!%-*&%*!%*+##*5&%
1&-#'"&!'#7%Z#.*3&&.#%9'($#%1&-#'"&!'&.#%.&'&&.0$%5&%*.#%+0.0*'#.0$%"!'(%"4#+&)&+*(#%+!%*G!(0$!.%
unor constrângeri. Aceste constrângeri sunt implementate cu ajutorul clasei
GridBagConstraints
O*+2%'!%"#%10$#5(#%)0.0"&$#*%'&+&%!'!&*%1&'($#%*+#5(&%-*'*/#$&%1#%.*S0!(B%*(!'+&%"#%40*(#%*4#.*%.*%
!"#$#!%&'(&)&*+!,-./)&)0!1 !%(%.(,!')2% +*1$!.%+0'(*&'#$!.!&7%Q#%40*(#%$#'!'3*%.*%-*'*/#$%4$&'%
*4#.*$#*%-#(01#&%"#(N*S0!(%+!%:*.0*$#*%'!..7%P&#+*$#%+0-40'#'(2%*12!/*(2%9'%+0'(*&'#$%(rebuie
1&-#'"&0'*(2%5&%406&3&0'*(2%-*'!*.%*(!'+&%+E'1%"#%)0.0"#"+%406&3&0'2$&.#%*>"0.!(#7
5
Paradigme de Programare
Laboratorul 6
@'%0>&#+(%D0-40'#'(% "*!%0%&'"(*'32%*%!'#&%+.*"#%1#$&:*(#%1&'%D0-40'#'(,%#"(#%1#"#'*(%"*!%
redesenat prin apelul metodei paint() *%&'"(*'3#&%$#"4#+(&:#% *4#.!.%#"(#%)2+!(%1&$#+(%"*!%4$&'%
*4#.!.%!'0$%-#(01#%&'(#$-#1&*$#%1#%+2($#%;JK,7%Q&'/!$!.%*$/!-#'(%*.%-#(01#&%4*&'( ,%#"(#%
un obiect de tip Graphics7%;+#"(%0>&#+(%0)#$2%"!40$(%4#'($!%&-*/&'&%5&%4#'($!%04#$*3&&%1#%
desenare primitive (linii, dreptunghiuri, text).
;JK%&':0+2%$#1#"#'*$#*%+0-40'#'(#&%9'%1&:#$"#%"&(!*3&&% $#1&-#'"&0'*$#B%
*+04#$&$#[1#"+04#$&$#%1#%+2($#%*.(#%)#$#"($#,%1*$%5&%4$0/$*-*(0$!.%40*(#%4$0:0+*%$#1#"#'*$#*%
unei componente prin apelul metodei repaint().
Obiectul GrapC&+"%*G!(2%.*%1#"#'*$#*%1&)#$&(#.0$%)0$-#<
Linie: drawLine()
Dreptunghi: drawRect(), fillRect(), clearRect(), fillRect(), draw3DRect(),
fill3DRect(), drawRoundRect(), fillroundRect()
L.&4"2<%drawOval(), fillOval()
Arc: drawArc(), fillArc()
Poligon: drawPolygon(), fillPolygon()
I#'($!%*%0>3&'#%1&-#'"&'&%"4#+&)&+#%!'!&%*'!-&(%)0'(%)0.0"&(%"#%40*(#%)0.0"&%!'%0>&#+(%1#%(&4%
FontMetrics.
?$*4C&+"%0)#$2%"!40$(%5&%4#'($!%.!+$!.%+!%&-*/&'&<
6.2. 1#23
Folosindu-:2%1#%+.*"#.#%;JKB%$#*.&6*3&%0%*4.&+*3&#%=*:*%+*$#%"2%"&-!.#6#%+*.+!.*(0$!.%0)#$&(%
&-4.&+&(%9'%J&'10R"% 4*$(#*%5(&&'3&)&+2%'!%#"(#%0>.&/*(0$&#,7
8'(#$*+3&!'#*%($#>!&#%"2%"#%)*+2%*(E(%4$&'%)0.0"&$#*%>!(0*'#.0$B%+E(%5&%*%(*"(#.0$%+0$#"4!'62(0*$#%
acestora.
6
Paradigme de Programare
Laboratorul 5
Laboratorul 5
5.1. I/O
5.1.1. Stream-urile
1
Paradigme de Programare
Laboratorul 5
PipedOutputStream PipedWriter
PrintStream Output stream PrintWriter E'%$*0!&$6&%$!2$!2".3&.$!
2$!2".3&.$! print() 6&!9%&.'/.J
9%&.'J !6&! PushbackReader Stream intrare ce permite
println() returnarea caracterelor
PushbackInputStream Stream intrare StringReader Pentru scriere/citire în
ce permite string-uri
returnarea StringWriter
RandomAccessFile
SequenceInputStream O"0A&.*3&$!
din 2 sau mai
multe stream-
uri de
intrare care
vor fi citite
succesiv
2
Paradigme de Programare
Laboratorul 5
5.2. ./ 0 !"#$%#&'(%)"
<.&3&*/!)*+*!*!"#$%&'!("*%!,'%$*0--%&/$!9$!"2'$3&1!&*%!2&'&%$*!($!/*!2".,"/5!($!$G$09/-!,$!9-'$*!#*2$!("*%!
folosind aceste stream--%&7!;$.'%-!*2$*,'*!2/*,*!<.9-'E'%$*0!"#$%5!0$'"(*!read() în 3 forme:
>A,$%+50!25!'"*'$!*2$,'$!0$'"($!9"'!L$.$%*!"!$G2$93&$!($!'&9-/!<>RG2$9'&".7
RG$09/-!($!2&'&%$!*!-.-&!*%%*B!($!"2'$3&@
import java.io.*;
class ReadBytes {
public static void main(String args[]) throws IOException {
byte data[] = new byte[10];
System.out.ptinln("Introduceti caractere: ");
System.in.read(data);
System.out.print("Ati introdus: ");
for (int i=0; i < data.length; i++) {
System.out.print((char) data[i]);
}
}
}
;$.'%-!/-2%-/!2-!#&6&$%$!#"/",&.(!,'%$*0--%&!9$!"2'$3&!,$!#"/",$,2!2/*,$/$!FileInputStream 6&!
FileOutputStream.
RG$09/-!2&'&%$!6&!*#&6*%$!2".3&.-'!#&6&$%!'$G'@
3
Paradigme de Programare
Laboratorul 5
import java.io.*;
class CitesteFisier {
public static void main(String args[]) throws IOException {
int i;
FileInputStream fin;
try {
fin = new FileInputStream(args[0]);
} catch (FileNotFounsException ex) {
System.out.println(“fisierul nu exista”);
return;
} catch (ArrayIndexOutOfBoundsException ex) {
System.out.println(”folosire: CitesteFisier <nume fisier>”);
return;
}
do {
i = fin.read();
if (i != -1) System.out.println((char) i);
} while(i != -1);
fin.close();
}
}
5.2.2. 4'!"%!%,#*"#'"("!%,#$,(%/&!#5"2,!%
Pentru a scrie sau citi valori binare ale tipurilor primitive (cum ar fi int, double sau short), se folosesc
clasele DataInputStream 6&!DataOutputStream.
F*'*>-'9-'E'%$*0!&09/$0$.'$*C5!&.'$%#*3*!DataOutput 2*%$!($#&.$6'$!0$'"($!9$.'%-!*!,2%&$!D.'%-un
stream toate toate tipurile primitive din Java: writeBoolean, writeByte… În mod analog
F*'*<.9-'E'%$*0!&09/$0$.'$*C5!&.'$%#*3*!DataInput 2$!($#&.$6'$!0$'"($!9$.'%-!2&'&%$*!+*/"%&/"%!
primitive din stream-uri: readBoolean, readByte…
RG$09/-!($!,2%&$%$!6&!2&'&%$!*!+*/"%&/"%!A&.*%$@
import java.io;
class ReadWriteBinaryData {
public static void main(String args[]) throws IOException {
DataOutputStream dataOut;
DataInputStream dataIn;
int i = 10;
double d = 123.45;
Boolean b = true;
try {
dataOut = new DataOutputStream(new FileOutputStream(“test.txt”));
} catch (IOException ex) {
System.out.println(“Fisierul nu poate fi accesat”);
return;
}
try {
dataOut.writeInt(i);
dataOut.writeDouble(d);
dataOut.writeBoolean(b);
} catch (IOException ex) {
4
Paradigme de Programare
Laboratorul 5
System.out.println(“Eroare la scriere in fisier”);
}
dataOut.close();
try {
dataIn = new DataInputStream(new FileInputStream(”test.txt”));
} catch(IOException ex) {
System.out.println(”Fisierul nu poate fi accesat”);
return;
}
try {
i = dataIn.readInt();
d = dataIn.readDouble();
b = dataIn.readBoolean();
} catch (IOException ex) {
System.out.println(”Eroare la citire din fisier”);
}
dataIn.close();
System.out.println(”valorile citite: ” + i + ” ” + d + ” ” + b);
}
}
K.!$G$09/-/!*.'$%&"%!*0!*22$,*'!#&6&$%-/!D.'%--.!0"(!,$2+$.3&*/1!"2'$'!2-!"2'$'7!)*+*!9$%0&'$!D.,5!6&!
accesul în 0"(!*/$*'"%&-!/*!2".3&.-'-/!-.-&!#&6&$%7!;$.'%-!*2$*,'*!,$!#"/",$6'$!2/*,*!RandomAccesFile,
2*%$!&09/$0$.'$*C5!&.'$%#$3$/$!DataInput 6&!DataOutput7!O".,'%-2'"%-/!*2$,'$&!2/*,$!$,'$!-%05'"%-/@
;$.'%-!2&'&%$!*22$,,MB9$!$,'$!T%T!&*%!9$.'%-!,2%&$%$!6&!2&'&%$!,$!#"/",$6'$!T%UT7
R,'$!"#$%&'!($!*,$0$.$*!6&!,-9"%'!9$.'%-!9"C&3&".*%$*!2*9-/-&!($!2&'&%$!/*!"!*.-0&'5!9"C&3&$@
Stream--%&/$!9$!"2'$3&!,-.'!*'4'!9-'$%.&2$!24'!6&!#/$G&A&/$7!M"'-6&!.-!,-.'!2$/$!0*&!9"'%&+&'$!*'-.2&!24.(!
'%$A-&$!,5!/-2%50!2-!2*%*2'$%$1!0"'&+!9$.'%-!2*%$!*-!#",'!2%$*'$!,'%$*0-urile pe caractere.
5.3.1. 1"("!%,#$%#/,#'&2+&/7
:0!+5C-'!*.'$%&"%!25!,'%$*0-ul de &.'%*%$!($!/*!'*,'*'-%5!$,'$!System.in1!2*%$!$,'$!-.!,'%$*0!9$!"2'$3&7!
Pentru a citi caractere vom folosi clasa InputStreamReader 2*%$!2".+$%'$6'$!"2'$3&&!D.!2*%*2'$%$1!&*%!
*2$*,'*!/*!%4.(-/!$&!$,'$!($!9%$#$%*'!,5!#&$!#"/",&'5!D.'%-un BufferedReader.
Pentru a citi caractere se pot folosi variantele metodei read() oferita de BufferedReder:
5
Paradigme de Programare
Laboratorul 5
5.3.2. 4'!"%!%,#/,#'&2+&/7
F$6&!,$!9"*'$!#"/",&!System.out 9$.'%-!*!,2%&$!0$,*H$!/*!2".,"/51!,$!%$2"0*.(5!#"/",&%$*!2/*,$&!
PrintWriter. Un constructor al acestei clas$!$,'$!-%05'"%-/@
;*%*0$'%-/!A""/$*.!,9$2&#&25!(*25!A-##$%-ul stream--/-&!$,'$!$/&A$%*'!($!#&$2*%$!(*'5!24.(!,$!#*2$!-.!
apel la metoda println()7!V$'"($/$!9%&.'J !6&!9%&.'/.J !"#$%&'$!($!;%&.'W%&'$%!,-9"%'5!'"*'$!'&9-%&/$1!
&.2/-,&+!>AH$2'7!;$.'%-!*!,2%&$!0$,*H$!/*!2".,"/5!,$!9"*'$!#"/",&!"!*,'#$/!($!&.,'*.35@
import java.io.*;
class test {
public static void main(String args[]) throws IOException {
FileWriter fw;
BufferedReader br = new BufferedReader(new
InputStreamReader(System.in));
try {
fw = new FileWriter(“test.txt”);
} catch (IOException ex) {
System.out.println(“fisierul nu este accesibil”);
return;
}
System.io.println(“Introduceti text: ”);
do {
String str = br.readLine();
if (str.compareTo(“END”) == 0) break;
fw.write(str);
} while (true);
fw.close();
}
}
6
Paradigme de Programare
Laboratorul 5
5.4. ./ 0 !"#8%#&5"%'(%#*"#+%!",/"9,!%
F*25!,$!D.'409/5!2*!0$'"(*!%$*(>AH$2'J !,5!.-!%$'-%.$C$!'&9-/!*6'$9'*'!6&!,$!D.2$*%25!'"'-6&!
2".+$%'&%$*!%$C-/'*'-/-&1!,$!"A3&.$!"!$G2$93&$!($!'&9-/!ClassNotFoundException.
V$'"($/$!%$*(>AH$2'!6&!U%&'$>AH$2'!,-.'!-6"%!($!#"/",&'1!(*%!/"L&2*!9$!2*%$!"!&09/$0$.'$*C5!
$,'$!($,'-/!($!,"#&,'&2*'57!;$.'%-!-.!"A&$2'!2*%$!D.2*9,-/$*C5!("ar valori primitive,
($=,$%&*/&C*%$*!$,'$!,&09/57!X-2%-%&/$!,$!2"09/&25!*'-.2&!24.(!-.!"A&$2'!2".3&.$!%$#$%&.3$!/*!
*/'$!"A&$2'$1!2*%$!/*!%4.(-/!/"%!9"'!2".3&.$!%$#$%&.3$!/*!*/'$/$7!K.!2*C-/!-.-&!*,'#$/!($!"A&$2'1!
0$'"(*!U%&'$>AH$2'!9*%2-%L$!D.'%$*L*!%$3$*!($!%$#$%&.3$!6&!,2%&$!'"*'$!"A&$2'$/$!D.!,'%$*0-ul
controlat. Astfel, un singur apel al metodei writeObject poate provoca un volum mare de date
,5!#&$!,2%&,$!D.!,'%$*07
0$'"(5!%$,9".,*A&/5!9$.'%-!,2%&$%$*!,'5%&&!"A&$2'-/-&!*,'#$/!D.24'!0$'"(*!
2"%$,9".($.'5!%$*(>AH$2'!,5!9"*'5!,5!D/!%$2".,'%-&*,257
%$,9".,*A&/5!9$.'%-!2&'&%$*!,'5%&&!"A&$2'-/-&!6&!%$2".,'%-&%$*!*2$,'-&*.
7
Paradigme de Programare
Laboratorul 5
S&6&$%$/$!C&9!,-.'!-.!#"%0*'!2"0-.!9$.'%-!#&6&$%$!*%I&+57!S&6&$%$/$!):Q!,-.'!,&0&/*%$!(*%!,-.'!
,9$2&#&2$!'$I."/"L&$&!)*+*!J2".3&.!-.!#&6&$%!0*.&#$,'!9%&.!2*%$!,$!($,2%&$!2".3&.-'-/! 7
)*+*!"#$%5!,-9"%'!9$.'%-!*22$,-/!/*!2".3&.-'-/!#&6&$%$/"%!C&97!O/*,$/$!*H-'5'"*%$!,$!*#/5!D.!
pachetul java.util.zip: ZipEntry, ZipFile, ZipInputStream, ZipOutputStream, iar pentru
$G2$93&&!ZipException.
ZipFile(File file)
ZipFile(File file, int mode)
ZipFile(String name)
;%&0$/$!("-5!#"%0$!9%&0$,2!-.!"A&$2'!($!'&9!S&/$1!&*%!*!'%$&*!#"%05!*22$9'5 .-0$/$!#&6&$%-/-&7!
V"(-%&/$!($!($,2I&($%$!,-.'!(*'$!($!2".,'*.'$/$!>;RYZQR:F!J&09/&2&' !6&!
>;RYZFRXRMR7!>(*'5!&.,'*.3&*'!-.!"A&$2'!($!*2$,'!'&9!,$!9"*'$!"A3&.$!"!/&,'5!*!&.'%5%&/"%!D.!
*%I&+57!:2$,'$*!,-.'!%$'-%.*'$!D.'%-"!$.-0$%*3&$!($!+*/"%&![&9R.'%B7!>!&.'%*%$!,$!9"*'$!"A3&.$!
6&!(&%$2'!#"/",&.(!.-0$/$!$&@!getEntry(String name).
import java.io.*;
import java.util.*;
import java.util.zip.*;
8.!"A&$2'![&9R.'B!.-!"#$%5!*22$,!(&%$2'!/*!2".3&.-'-/!&.'%5%&&!%$,9$2'&+$!(&.!*%I&+51!2&!"#$%5!
("*%!&.#"%0*3&&!($,9%$!*2$*,'*7!;$.'%-!*!"A3&.$!*22$,!/*!,'%$*0-ul de intrare asociat, se
#"/",$6'$!0$'"(*!"#$%&'5!($![&9S&/$@!getInputStream(ZipEntry entry).
RG$09/-!-%05'"%-/!$G'%*L$!-.!*.-0&'!#&6&$%!(&.'%-"!*%I&+5@!9%&0-/!*%L-0$.'!$,'$!#&6&$%-/!C&91!
*/!("&/$*!$,'$!.-0$/$!&.'%5%&&1!&*%!*/!'%$&/$*!$,'$!.-0$/$!#&6&$%-/-&!$G'%*,7
8
Paradigme de Programare
Laboratorul 5
import java.io.*;
import java.util.*;
import java.util.zip.*;
5.6. Tem7
1. Testa\&!$G$09/$/$!(&.!/*A"%*'"%7
2. Q$*/&C*3&!"!*9/&2*3&$!2*%$!,5!9$%0&'5!,*/+*%$*!-.$&!/&,'$!($!25%3&!D.!N!#"%0*'$!(&#$%&'$@!'$G'1!"A&$2'$!
serializate (binar) 6&!#&6&$%!*%I&+*' J*%I&+5!- binar). F$!*,$0$.$*1!D.!#-.23&$!($!$G'$.,&*!#&6&$%-/-&!2&'&'!
($!/*!'*,'*'-%51!,$!+"%!2&'&!6&!*#&6*!25%3&/$!(&.!%$,9$2'&+-/!#&6&$%!J'$G'1!A&.*%!,*-!*%I&+5 7
Aplica\ia trebuie s5 trateze toate situa\iile/erorile ce pot s5 apar5 la rularea programului (de ex.:
numele fi]ierului introdus este invalid, fi]ierul citit este corupt, etc.) Pentru implementare se poate
folosi programul realizat în cadrul Laboratorului 2.
Id: 123
Autor: Charles Dickens
Titlu: Great Expectations
ISBN: 0141439564
Editura: Penguin Classics
AnAparitie: 2002
Id: 124
Autor: Jane Austen
Titlu: Pride and Prejudice
ISBN: 0553213105
Editura: Bantam Classics
AnAparitie: 1983
9
Paradigme de Programare
Laboratorul 4
Laboratorul 4
4.1. !"#$%&&
!"#$%&&'#()*+,(-#(./$,(#010&("/0#(/$/0('/(0*'/0#/(/$'&"/%&#&(23+(,&4$*'(#!#"*%&#&5(+*('/("14$&'/0#67(
81'1)&+-()&),#4*'(-#("1+,01'(/'(#!"#$%&&'10(1.#0&,(-#(9/:/()#($1,(,0/,/(/),.#'(#010&'#("#($1,(/$;0#/('/(
#!#"*%(<+(/',#('&4=/>#(-#($01?0/4/0#(/+*4&,#("1-*0&(-#(#01/0#(#0/*(0#,*0+/,#(-#(*+#'#(4#,1-#(/(
";010(#!#"*%&#(#@*/5(&/0(/"#),#("1-*0&(,0#=*&/*(:#0&.&"/,#(4/+*/'(-#(.&#"/0#(-/,;("A+-(1(/),.#'(-#(
4#,1-;(#0/(/$#'/,;7(B"#/),;(/=10-/0#(#0/(-&.&"&';(-/0(@&($0#-&)$*);('/($01:1"/0#/(#010&'10(3+()"0�#/(
codului. Sistemul oferit de Java permite definirea unui bloc de cod (exception handler6("/0#();(.&#(
#!#"*,/,(/,*+"&("A+-(/$/0#(1(#01/0#7(C*(4/&(#),#(+#"#)/0;(/),.#'(:#0&.&"/0#/(/+*4&,10("1-*0&(-#(#01/0#7
În java, #!"#$%&&'#()*+,(0#$0#D#+,/,#(-#("'/)#(@&(,1/,#()*+,(#!,&+)#(-&0#",()/*(&+-&0#",(-&+("'/)/(
Throwable7(B),/(3+)#/4+;(";(/,*+"&("A+-(1(#!"#$%&#(/$/0#(3+(#!#"*%&/("1-*'*&5(1(/),.#'(-#("'/);(#),#(
?#+#0/,;7( !&),;(-1*;("'/)#(#!,&+)#(-&0#",(-&+(EF01G/='#H
Error
I#$0#D&+,;(#!"#$%&&('#?/,#(-#(#010&("#(/$/0("F&/0(3+(4/@&+/(:&0,*/';(9/:/(@&(+*(3+("1-*'()"0&)(-#(
+1&7(B"#),#(,&$*0&(-#(#010&(+*()*+,(,0/,/,#(-#(/$'&"/%&&'#(+1/),0#7
Exception
I#$0#D&+,;(#010&("#(0#D*',;(-&+(#!#"*%&/("1-*'*&()"0&)(-#(+1&(2#!H(34$;0%&0#('/ J5(&+-#"@&(3+(
/./0/('&4&,#'10()/*(#010&('/(/""#)/0#/(*+10(.&@�#67(B$'&"/%&&'#(,0#=*&#();(,0/,#D#("10#)$*+D;,10(
#010&(-#(/"#),(.#'7(K()*="'/);(&4$10,/+,;(#),#(RuntimeException "/0#(0#$0#D&+,;(-&:#0)#(#010&(
"#($1,(/$;0#/('/(#!#"*%
M'1"*'(,0QR"/,"F(),;('/(=/D/()&),#4*'*&(-#(,0/,/0#(/(#010&'107(K($10%&*+#(-#("1-(+*($1/,# .&(41+&,10&D/,;(
$#+,0*(,0/,/0#/(#!"#$%&&'10(.;0;(/(.&(&+"'*);(3+,0-un astfel de bloc.
8104/(?#+#0/';H
try {
//blocul ce trebuie monitorizat
}
catch (ExceptionTypeA e) {
!"#!#"$#%&$'!"(%)%$*+$&,-$%.$%!-&(/%0*+$&!-)'12&$3
1
Paradigme de Programare
Laboratorul 4
}
catch (ExcpetionTypeB e) {
!"#!#"$#%&$'!"(%)%$*+$&,-$%.$%!-&(/%0*+&$!-)'12&$4
}
K=)#0:;4(";($1,(.&(4/&(4*',#(='1"*0&("/,"F(/)1"&/,#(/"#'*&/@&(=1"(,0Q5(&/0(-/";(1(#!"#$%&#(#),#(/0*+"/,;(
3+(='1"*'(,0Q(/"#/),/(#),#($0&+);(3+(='1"*'("/,"F("10#)$*+D;,107(M'1"*'("/,"F("#(*04#/D;(); trateze
#!"#$%&/()#(/'#?#(3+(.*+"%&#(-#(,&$*'(#!"#$%&#&(/)1"&/,("*(/"#),("/,"F(/),.#'H(-/";(*+(,&$(-#(#!"#$%&#(
)$#"&.&"/,(-#(1(&+),0*"%&*+#("/,"F()#($1,0&:#@,#("*(,&$*'(#!"#$%&#&("#(,0#=*&#(,0/,/,#5(/,*+"&(='1"*'(/"#'#&(
&+),0*"%&*+&("/,"F()#(#!#"*,;(&/0(#:#+,*/'#'#(='1"*0&("/,"F("/0#(*04#/D;()*+,(&?+10/,#7( !"#$%&/(
?#+#0/,;("#(,0#=*&#(,0/,/,;()#(1=%&+#($0&+($/0/4#,0*'(&+),0*"%&*+&&("/,"F7(S+(/)$#",(&4$10,/+,(-#(
0#4/0"/,(#),#(";(*+*'(-&+(='1"*0&'#("/,F()#(#!#"*,;(+*4/&(3+("/D*'(3+("/0#(1(#!"#$%&#(#),#(?#+#0/,;(3+(
"10$*'(,0Q("10#)$*+D;,10(@&(,&$*'(/"#),#&(#!"#$%&&()#($1,0&:#@,#("*("#'()$#"&.&"/,(-#(&+),0*"%&*+#/("/,"F(
0#)$#",&:;7(N/";(+&"&(1(#!"#$%&#(+*(#),#(?#+#0/,;(#!#"*%&/(-#"*0?#(+104/'();0&+-($#),#(='1"*0&'#("/,"F7
Exemplu
T#@&0#/(3+(*04/(#!#"*%&#&(#),#(*04;,1/0#/H
K=)#0:;4(";(/,*+"&("A+-(3+"#0";4();(/""#);4(1($1D&%&#(?0#@&,;(-&+,0-*+(:#",105(1(#!"#$%&#(#),#(
/0*+"/,;(3+(/./0/(='1"*'*&(,0Q5(#!#"*%&/(/"#),*&(='1"()#(3+,0#0*$#(&/0("1+,01'*'(#),#($0#'*/,(-#(='1"*'(
catch. Aspectul imp10,/+,(/,*+"&("A+-(1(#!"#$%&#(#),#(?#+#0/,;(#),#(";(1(&+),0*"%&*+#("/,"F(+*(#),#(
/$#'/,;("&($*0(@&()&4$'*(.&0*'(#!#"*%&#&(#),#(,0/+).#0/,(/"#),*&(='1"7(B"#),('*"0*(3+)#/4+;(";(/,*+"&("A+-(
"1-*'("/,"F(3@&(,#04&+;(#!#"*%&/(.&0*'(#!#"*%&#&(+*(0#:&+#(3+(='1"*' try acolo unde s-/(?#+#0/,(#!#"*%&/(
"&(,0#"#('/($0&4/(&+),0*"%&*+#(-*$;(='1"*0&'#("/,"F7
2
Paradigme de Programare
Laboratorul 4
În *04/(0*';0&&($01?0/4*'*&(-#(,#),(1=%&+#4(/"#'/@&(0#D*',/,7(K=)#0:;4(";(#!"#$%&/(?#+#0/,;(3+("/-0*'(
4#,1-#&(-#(,#),(+*(#),#($0&+);(@&(,0/,/,;($0&+(*04/0#(/"#/),/(:/(.&($0&+);(3+(='1"*'(,0QR"/,"F(-&+(4#,1-/(
apelatoare.
N/";(1(#!"#$%&#(#),#(?#+#0/,;(@&(+*(#),#(,0/,/,;(+&";�&5(/,*+"&(3+);@&(#!#"*%&/($01?0/4*'*&(:/(.&(
3+,0#0*$,;5(#!#"*%&/(.&&+-($0&+);(-#(4/@&+/(:&0,*/';7(S+(/),.#'(-#("14$10,/4#+,(/'(/$'&"/%&#&(3+("/D*'(
?#+#0;0&&(#!"#$%&&'10($1/,#(.&(*,&'(-1/0(3+("/D*'(0*';0&&($#+,0*(,#),()/*($#+,0*(-#=*?7( ),#(*@10(-#(3+%#'#)(
-#("#(,0#=*&#();($0&+-#4(@&();(,0/,;4("10#)$*+D;,10(#!"#$%&&'#7(N/";("1-*'("/0#($01:1/";(?#+#0/0#/(
este cuprins într-*+(='1"(,0QR"/,"F(-/0(+&"&(1(&+),0*"%&*+#("/,"F(+*()$#"&.&";(*+(,&$(-#(#!"#$%&#($1,0&:&,(
"*("#'(/'(#!"#$%&#&(?#+#0/,#5(/,*+"&(/"#/(#!"#$%&#(#),#(/0*+"/,;(4/&(-#$/0,#5(*04A+-();(.&#($0&+);(-#(*+(
/',(#:#+,*/'(='1"(,0QR"/,"F()/*(-/";(+*(-#(4/@&+/(:&0,*/';7
4.1.2. !"#$%&&'#()&(*+,"'-*#'#
B,*+"&("A+-()#(),/=&'#@,#("#(='1"("/,"F(,0#=*&#();(,0/,#D#(1(/+*4&,;(#!"#$%("1+,#/D;($1,0&:&0#/ dintre
,&$*'(/"#),#&/(@&(,&$*'()$#"&.&"/,(-#(&+),0*"%&*+#/("/,"F7(B"#/),;($1,0&:&0#(%&+#("1+,(@&(-#(�/0F&/(-#(
"'/)#("#(0#$0#D&+,;(#!"#$%&&'#7(B),.#'5(1(&+),0*"%&*+#("/,"F("#()$#"&.&";(,&$*'(EF01G/='#(:/("/$,/(10&"#(
,&$(-#(#!"#$%(P*,#4(/),.#'();(,0/,;4(3+(41-(#!$'&"&,(*+#'#(#!"#$%&&(&/0(0#),*'();('#($0&+-#4($#(,1/,#(
@&();(1.#0&4(1(,0/,/0#(?#+#0&";7(E0#=*&#(/:*,(3+(:#-#0#(3+);(10-&+#/(3+("/0#()$#"&.&";4(/"#),#(,&$*0&H(*+(
)*=,&$(,0#=*&#()$#"&.&"/,(3+/&+,#/(10&";0*&(,&$(-#(=/D;(/'();*5(/',.#'("1-*'('10(+* va mai putea fi executat
+&"&1-/,;7
K=)#0:;4(";(#!"#$%&/($01:1"/,;(-#(&+-#!*'(?0#@&,(#),#(,0/,/,;(3+(41-(#!$0#)5(&/0("#'#'/',#()*+,($0&+)#(
$#+,0*(/($#04&,#("1+,&+*/0#/(#!#"*%&#&("1-*'*&7
3
Paradigme de Programare
Laboratorul 4
4.1.3. .#/#0-0#-(1-/+-'2(-(#!"#$%&&'30
<+(#!#4$'#'#(/+,#0&1/0#(/4(1=)#0:/,(,0/,/0#/(#!"#$%&&'10(?#+#0/,#(/*,14/,(-#(";,0#(4/@&+/(:&0,*/';7(
81'1)&+-(&+),0*"%&*+#/(throw #!"#$%&&'#($1,(.&($01:1"/,#(@&(4/+*/'7(P/0/4#,0*'(&+),0*"%&*+&&(,F01G(
,0#=*&#();(.&#(*+(1=&#",(-#(,&$*'(*+#&()*="'/)#(EF1G/='#7
!"#$%&/(?#+#0/,;(,0#=*&#("0#/,;(2+#G67( !&),;($1)&=&'&,/,#/();()#(/0*+"#(4/&(-#$/0,#(1(#!"#$%&#(-#>/(
#!&),#+,;7(S+(/),.#'(-#("14$10,/4#+,(/0(.&(-#(-10&,(/,*+"&("A+-(-10&4();(,0/,;4(/"##/@&(#!"#$%&#('/(4/&(
multe niveluri logice, fiecare ocupându-se de un anumit aspect.
Într-*+(='1"("/,"F(,0/,;4(*+(/+*4&,(,&$(-#(#01/0#(3+(.*+"%&#(-#(&+.104/%&&'#("#()#($1,(1=%&+#(-&+(
1=&#",*'(#!"#$%&#($0&4&,("/($/0/4#,0*7(E1/,#(#!"#$%&&'#()*+,()*="'/)#(EF1G/='#(@&(1.#0;(*04;,1/0#'#(
metode utile:
printStackTrace(): /.&@#/D;(/$#'*0&'#()*""#)&:#("/0#(/*(-*)('/("1-*'("#/(?#+#0/,(#!"#$%&/
getMessage(): -#)"0�#(/(#!"#$%&#&
toString(): 0#,*0+#/D;(*+(1=&#",(U,0&+?("#("1+%&+#(-#)"0�#/(#!"#$%&#&
B,*+"&("A+-()#(-10#@,#("/(/+*4&,#($10%&*+&(-#("1-();()#(#!#"*,#(&+-&.#0#+,(-/";(='1"*'(,0Q()-a executat
+104/'()/*(/(?#+#0/,(1(#!"#$%(.1'1)&4(='1"*'(finally:
T#@&0#/(3+(*04/(0*';0&&(+#(/0/,;(";(='1"*'(.&+/''Q()#(#!#"*,;(&+-&.#0#+,(-#(41-*'(3+("/0#(='1"*'(,0Q(@&-a
,#04&+/,(#!#"*%&/7
N/";(1(4#,1-;("1+%&+#("1-("#(/0($*,#/(?#+#0/(1(#!"#$%&#(@&(,1,*@&(3+("/-0*'(4#,1-#&(+*(#!&),;(*+(='1"(
,0QR"/,"F("/0#();($0&+-;(/"#/(#!"#$%(/,*+"&(/"#/(4#,1-;(,0#=*&#();()$#"&.&"#($0&+("'/*D/(throws ";(
$1/,#(?#+#0/(/"#/(#!"#$%(E1,*@&(+*()#()*$*+(/"#),#&(0#?*'&(#!"#$%&&'#("/0#()*+,()*="'/)#(/'#("'/)#'10(
Error @&( !"#$%&'()&*+$,". Încercarea -#(/(14&,#("'/*D/(,F01G)("*(1('&),;("10#)$*+D;,1/0#(-#(
#!"#$%&&($#("/0#(4#,1-/('#($1/,#(?#+#0/(:/(0#D*',/(3+,0-o eroare la compilare.
V#,1-/("/0#(:/(/$#'/(/"#/),;(4#,1-;(:/(.&(1='&?/,;('/(0A+-*'(#&();($0&+-;(@&();(,0/,#D#(#!"#$%&/()/*();(
specifice prin cla*D/(,F01G)("/($1/,#(?#+#0/(4/&(-#$/0,#(#!"#$%&/(0#)$#",&:;7
import java.io.IOException;
5
Paradigme de Programare
Laboratorul 4
4.2. Generice
Scopul introducerii tipurilor generice în limbajul Java a fost cel de a ajuta la descoperirea mai
#.&"&#+,;(/(=*?-urilor. Unele bug-*0&()*+,(4/&(*@10(-#(-#$&),/,5(-#(#!#4$'*("#'#(-#)"1$#0&,#('/(
"14$&'/0#(&+-&";(&4#-&/,(+#0#?*'&'#(-&+("1-7(E&$*0&'# ?#+#0&"#(/>*,;('/()"0�#/(*+*&("1-(4/&(
sigur tocmai prin determinarea unor bug-*0&();(.&#(-#,#",/=&'#('/("14$&'/0#7
E&$*0&'#(?#+#0&"#()*+,(&+,#+)(.1'1)&,#(-#("'/)#'#("/0#(&4$'#4#+,#/D;("1'#"%&&(-#(-/,#7(K(/),.#'(
-#("'/);5(.;0;(/(.1'1)&(,&$*0&(?#+#0&"#5(/0("1+,01'/(1("1'#"%&#(-#(1=&#",#(-#(,&$(Object.
B-;*?/0#/(-#(1=&#",#(-#(10&"#(,&$(24/&($*%&+("#'#($0&4/0#6()#($1/,#(./"#(.;0;($01='#4#7(
P01='#4#(/$/0(/,*+"&("A+-(/:#4(+#:1&#();(#!,0/?#4(*+(1=&#",(-#(*+(/+*4&,(,&$(-&+,0-o
"1'#"%&#(-#(-/,#7(K=&#",*'(1=%&+*,(#),#(-#(,&$(K=>#",5(&/0(+1&(,0#=*&#();(./"#4(1("1+:#0)&#(
/-#":/,;(#!$'&"&,;7(B&"&(#),#($*+",*'(*+-#($1,(/$;0#/($01='#4#'#7(81'1)&+-(1("1+:#0)&#(
#!$'&"&,;('/(*+(,&$($#("/0#(3'(@,&4(+1&(";(#),#("#'("10#",5(+*($#04&,#("14$&'/,10*'*&(3+(+&"&(*+(
.#'();(:#0&.&"# -/";("1+:#0)&/(#),#(*+/($#04&);7(N/";(*+(/+*4&,(1=&#",(#!,0/)(-&+,0-1("1'#"%&#(
-#(-/,#(+*(#),#(-#(,&$*'(/@,#$,/,5(/,*+"&(3+"#0"/0#/(-#("1+:#0)&#(:/(?#+#0/(1(#!"#$%&#(3+(,&$*'(
#!#"*%&#&7
'(&%*-!./010.2&"&1$)3:
W*;4("/(#!#4$'*(1("'/);("#("1+%&+#(*+(1=&#",(-#(*+(/+*4&,(,&$(@&(./"#(/+*4&,#($0#'*"0;0&(
/)*$0/(/"#'*&(1=&#",7(X*4(-10&4("/(.*+"%&1+/'&,/,#/(1.#0&,;(-#(/"#/),;("'/);();(1($*,#4(.1'1)&(
/)*$0/(*+10(1=&#",#(-#(10&"#(,&$5(:14(.1'1)&(1(&+),/+%;('/(*+(1=&#",(-#(,&$(K=>#",7(B),.#'(-#(
"'/)#("#(&4$'#4#+,#/D;(.*+"%&1+/'&,;%&("#()#($1,(/$'&"/(*+10(1=&#",#(-#(-&:#0)#(,&$*0&()*+,(-#)(
3+,A'+&,#(@&(*,&'#(2"1'#"%&&(-#(-/,#5(),&:#5("1D&5('&),#6(@&(#),#('#)+#(-#(3+%#'#)(";(+*(-10&4();(
./"#4("A,#(1(+1*;(&4$'#4#+,/0#($#+,0*(.&#"/0#(,&$(-#(1=&#",("*("/0#(/:#4(+#:1&#('/(*+(
414#+,(-/,();($1$*';4(1(/),.#'(-#("'/);7(P#+,0*()&4$'&,/,#(#!#4$'*'(+1),0*(:/(.&(1("'/);("#(:/(
"1+%&+#(*+()&+?*0(1=&#",7
package work;
P#+,0*(/(,#),/("'/)/()"0&);(:14()#,/(*+(#'#4#+,(@&-'(:14(#!,0/?#7(K=)#0:;4(";(:/'1/0#/(
3+,0#/?;($#("/0#(1()#,;4(#),#(1(:/'1/0#($0&4&,&:;(2+*(#),#(1(0#.#0&+%;('/(*+(1=&#",5(-#"&(3+(41-(
+104/'(+*($1/,#(.&("1+:#0,&,;('/(,&$*'(K=>#",($#("/0#(4#,1-/(3'(/@,#/$,;). O ”convertire”
&4$'&"&,;(#),#(0#/'&D/,;(-#(";,0#("14$&'/,10(-#('/($0&4&,&:*'(int '/("'/)/("#(3+?'1=#/D;(*+(&+,H(
Integer7(XA+-(#!,0/?#4(#'#4#+,*'(1=%&+#4(*+(1=&#",(K=>#",($#("/0#(3'("1+:#0,&4('/(,&$*'(
T+,#?#0(2@,&4(";(#),#(-#(/"#),(,&$6(&/0(O"1+:#0,&0#/O la tipul primitiv int al obiectului val se
face implicit. Aceste convertiri implicite se numesc boxing/unboxing.
6
Paradigme de Programare
Laboratorul 4
package work;
K=)#0:;4("/($*+",*'(:*'+#0/=&'(/'("1-*'*&(#),#(414#+,*'("A+-(#!,0/?#4(:/'1/0#/(@&(1(
"1+:#0,&4('/(/"#'(,&$($#("/0#(@,&4(+1&(";('-am folosit când am introdus variabila în Container.
Într-1(/$'&"/%&#(0#/';("*(*+(?0/-(4/&(0&-&"/,(-#("14$'#!&,/,#(#!&),;($1)&=&'&,/,#/();(+*(4/&(
O@,&4O(,&$*'(0#/'(/'(1=&#",*'*&(#!,0/)()/*("#(,&$(-#(1=&#",(,0#=*&#(&+,01-*)(3+("1+,/&+#07(U;(
3+"#0";4(-#(#!#4$'*(3+(/$'&"/%&/(+1/),0;(-#(,#),();(&+,01-*"#4(*+(#'#4#+,(-#(,&$(String:
container.setElement("10");
K=)#0:;4(";('/("14$&'/0#(+*()*+,#4(/:#0,&D/%&(3+(+&"&(*+(.#'5(&/0(-/";(:14(0*'/(-&+(+1*(
/$'&"/%&/(:14(1=%&+#(1(#!"#$%&#H
P#+,0*(-#"'/0/0#/(*+*&(,&$(?#+#0&"()#(.1'1)#@,#(1(:/0&/=&';(-#(,&$5(+*4&,;(T7(B"#/),;(:/0&/=&';(-#(,&$(
$1/,#(.&(.1'1)&,;(10&*+-#(3+("/-0*'("'/)#&(@&($#),#(,1,(:/(/:#/(3+%#'#)*'(,&$*'*&("#(:/(.&(-/,("/($/0/4#,0*(
'/(&+),/+%�#/("'/)#&7(N/";(&+&%&/'5(3+(#!#4$'*'(+1),0*5(.1'1)#/4(,&$*'(K=>#",($#+,0*(/($*,#/(/-/$,/(
implementarea la orice tip de obiecte, acum vom folosi tipul T ce va putea înlocui orice tip. Clasa
+1/),0;5(.1'1)&+-(?#+#0&"#()#(:/(,0/+).104/(/),.#'H
package work;
private T element;
public T getElement() {
return element;
}
}
7
Paradigme de Programare
Laboratorul 4
Container<Integer> container = new Container<Integer>();
B$'&"/%&/(-#(,#),(/(,&$*'*&()#(41-&.&";(/),.#'H
package work;
K=)#0:;4(";('/(#!,0/?#0#/(#'#4#+,*'*&(+*(4/&(#),#(+#"#)/0;(+&"&(1("1+:#0)(-#1/0#"#(4#,1-/(
0#,*0+#/D;(/"*4(*+(1=&#",(-#(,&$*'(-/,("/($/0/4#,0*(2T+,#?#06(@&(+*(K=>#",7(P01='#4/(,&$*'*&(0#,*0+/,(
#),#(/),.#'(0#D1':/,;5(1(3+"#0"/0#(-#(/("1+:#0,&(1=&#",*'(0#,*0+/,('/(*+(,&$(&+"14$/,&=&'(:/(genera o
#01/0#(-#("14$&'/0#("10#)$*+D;,1/0#7(V/&(1=)#0:;4(-#(/)#4#+#/(";('/()#,/0#/(#'#4#+,*'*&5(4#,1-/(
/@,#/$,;(*+(1=&#",(-#(,&$*'(T+,#?#05(&/0(-/";(3+"#0";4(-&+(+1*();()#,;4(1(:/0&/=&';(U,0&+?5(:14(1=%&+#(
-#(/"#/),;(-/,;(1(#01/0#('/("14$&'/0#7
P#('A+?;(-#$&),/0#/(/"#),10(?0#@#'&(3+(,&4$*'("14$&';0&&5(1=)#0:;4(";(,&$*0&'#(?#+#0&"#(4/&(/-*"(*+#'#(
/:/+,/>#H("1-*'(#),#(4/&('&D&=&'(@&(4/&(*@10(-#(3+%#'#)5(&/0("A+-(.1'1)&4("1-()"0&)(-#(/',"&+#:/(#),#(*@10(
-#(1=)#0:/,("#(,&$*0&($*,#4(.1'1)&(/,*+"&("A+-('*"0;4("*("1'#"%&&(-#(-/,#()/*(/',.#'(-#(&4$'#4#+,;0&(
comune.
E#F+&"/(,&$*0&'10(?#+#0&"#()#($1/,#(/$'&"/(/,A,(3+("/D*'("'/)#'10("A,(@&(3+("/D*'(&+,#0.#%#'107
S+(,&$(?#+#0&"($1/,#(/:#/(4/&(4*'%&($/0/4#,0&(-#(,&$7(N#(#!#4$'*("'/)/(-&+(#!#4$'*'(/+,#0&10()-ar
declara /),.#'(-/";(/0(/:#/(Y($/0/4#,0&(-#(,&$H(Container<T,U>7(P0&+("1+:#+%($/0/4#,0&&(-#(,&$()#(
numesc începând cu litera T (Type).
P/0/4#,0&&(-#(,&$($1,(.&(/$'&"/%&(@&(4#,1-#'10(2&+"'*)&:("1+),0*",10&'1067(B"#),#/()#(:10(+*4&(metode
generice (constructori generici67(E#F+&"/(#),#()&4&'/0;("*("#/(-#('/(,&$*0&'#(?#+#0&"#5(-#"A,(";()"1$*'(
$/0/4#,0&'10(-#(,&$()#(0#D*4;('/(4#,1-/(2"1+),0*",10*'6(3+("/0#(/"#@,&/(/*(.1),(-#"'/0/%&7
package work;
!"#$%#&'("$)#&("*+'%,"-%.%#"+!"%/%,*)+".% ,%'0.("1%!%23$(4"5#"*23,+)"#*%)"06&%2-(,"$#"&%"
&*%$373$("'3*+)".023'8".#2"#$%&'")+$2+"!+"%&'%"06)31#'023+8".%0#2%$%"$0,*3)#'02+)"*0#'%".%.+$%"&3!1+2"
tipul necesar (type inference94"5#"#)".03)%#"#*%)"06&%2-(,"$("!+",#3"&*%$373$(,"'3*+)".023'8"3#2".#$("
2+)(,"'%&'+)"-0,"-%.%#"$("'3*+)".%.+&"%&'%"Integer :$)#&#";!"$#2%"&%";!1)06%#<("+!"'3*"*23,3'3-"3!'94
4.2.3. !"#$%&'%()*$!*+,*$*-!#$%.($+/!+#%,
=>!("#$+,"#,"06&%2-#'"$("#'+!$3"$>!."70)0&3,"1%!%23$%"!+"%/3&'("!3$3"+!"7%)".%"2%&'23$?30!#2%";!"$%%#"
$%"*23-%@'%"*#2#,%'233".%"'3*8";!"&%!&+)"$(")#"3!-0$#2%#"'3*+23)02"*#2#,%'23<#'%"*+'%,"70)0&3"023$%"7%)".%"
'3*4"=0'"#*(2%#"'0'+@3"&3'+#?33"$>!.".023,"$#"0"$)#&("&("&%"0$+*%"!+,#3"$+"+!"#!+,3'"'3*".%"063%$'%4"
A$%&'#";!&%#,!("$(".023,"&("2%&'23$?30!(,"*#2#,%'233".%"'3*"!+,#3")# tipuri care extind anumite clase
@3B&#+"3,*)%,%!'%#<("#!+,3'%"3!'%27%?%4
!"#$%&'"&$0*"&%"70)0&%@'%"$+->!'+)"$C%3%"extends8".#2"&%!&+)"&(+"%&'%"+!+)"1%!%2#)8"#.3$("&%"2%7%2("#'>'"
)#"%/'3!.%2%#".%"$)#&%"$>'"@3")#"3,*)%,%!'#2%#".%"3!'%27%?%4"D%"%/%,*)+".#$( dorim ca exemplul
#!'%2302"E0!'#3!%2"&("&%"0$+*%"!+,#3".%"-#)023"!+,%23$%8"#'+!$3"70)0&3,"*%!'2+"2%&'23$?30!#2%"$)#&#"
Number8"$#2%"%&'%"$)#&#".%"6#<("*%!'2+"'0#'%"$)#&%)%"$%";!1)06%#<("0"-#)0#2%"*23,3'3-("!+,%23$(":$+,"
este Integer pentru int). Clasa devine astfel:
package work;
private T element;
public T getElement() {
return element;
}
}
package work;
9
Paradigme de Programare
Laboratorul 4
D#$("-0,";!$%2$#"&("3!&'#!?3%,"'3*+)"*#2#,%'23<#'"$+"+!"'3*"$#2%"!+"%/'3!.%"F+,6%28"G'23!1".%"
%/%,*)+8"-0,"06?3!%"0"%20#2%")#"$0,*3)#2%H
4.2.4. !.*'%%.!+0)#$!+#%,1$%.!+2!)!$%&!
!"$#<+)"'3*+23)02"1%!%23$%"&3'+#?3#"&'("+!"*3$".37%23'4"D#$("+!"063%$'"I!'%1%2"%&'%"@3"+!"063%$'"F+,6%28"
+!"063%$'"E0!'#3!%2JI!'%1%2K"!+"%&'%"@3"+!"063%$'"E0!'#3!%2JF+,6%2K4"D%@3"*#2%"!%#@'%*'#'(8"#$%#&'("
3.%%"#2%"'0'+@3"&%!&4"D#$("+!"063%$'"I!'%1%2"%&'%"+!"063%$'"F+,6%2"$+"!3@'%"*20*23%'(?3"&+*)3,%!'#2%"@3"
*0#'%".%$3";!)0$+3"$+"&+$$%&"+!"063%$'"F+,6%28"+!"063%$'".%"'3*"E0!'#3!%2JI!'%1%2K"$0!'20)%#<("+!"
obiect I!'%1%2";!",0."&*%$3#)8"@3"!+"&%"*0#'%"#&+,#"7#*'+)"$("*0#'%"$0!'20)#"$+"&+$$%&"023$%"063%$'".%"
tip Number.
L6&%2-(,"70)0&32%#"$#2#$'%2+)+3"M":N3).$#2.9"$#2%"&+6&'3'+%"023$%"'3*"$#2%"%/'3!.%"F+,6%24
10
Paradigme de Programare
Laboratorul 4
4.3. 3(.!&'%%
!"#$%#&#H"'3*+23"#6&'2#$'%".%"2%*2%<%!'#2%"#"$0)%$?33)024"AO+'(")#",#!3*+)#2%#"$0)%$?33)02";!"
,0."3!.%*%!.%!'".%"3,*)%,%!'(23)%")02"@3"702,%#<(".%"2%1+)("3%2#2C334
'()#'#!"*$+H"3,*)%,%!'(23)%"$0!$2%'%"#)%"2%*2%<%!'(23)02"#6&'2#$'%",%!?30!#'%"#!'%2302
AlgoritmiH"3,*)%,%!'(23"#)%"+!02"*20$%&(23"$0,+!%"#*)3$#'%"$0)%$?33)028"$+,"#2"73"&02'(23"@3"
$(+'(234"A$%@'3"#)1023',3"&+!'"*0)3,0273$3H"*0'"73"#*)3$#?3".37%23'%)02"3,*)%,%!'(23"#)%"
2%*2%<%!'(23)02"#6&'2#$'%4
4.3.1. 4)#!$5!'!.!
L6&%2-(,",#3"O0&"3%2#2C3#"3!'%27%?%)02".3!"E0))%$'30!"S2#,%N02R
L"06&%2-#?3%"3,*02'#!'("%&'%"7#*'+)"$("'0#'%"3!'%27%?%)%".3!"#$%#&'("3%2#2C3%"&+!'"1%!%23$%4
Collection: repr%<%!'#2%#"#6&'2#$'("#"+!+3"12+*".%"063%$'%"!+,3'%"elemente.
L*%2#?33".%"6#<(H"!+,(2+)".%"%)%,%!'%":size, isEmpty98"%/3&'%!?#"+!+3"%)%,%!'";!"$0)%$?3%":contains),
#.(+1#2%"@3"%)3,3!#2%".%"%)%,%!'%":add, remove9"@3"07%232%#"+!+3"3'%2#'02":ietrator).
Parcurg%2%#"%)%,%!'%)02H"&%"*0'"70)0&3".0+(",0.+23"*%!'2+"#"*#2$+21%"-#)023)%"+!%3"$0)%$?33H"70)0&3!."
3!&'2+$?3+!%#"702-%#$C"&#+"70)0&3!."+!"3'%2#'024"I!&'2+$?3+!%#"702-%#$C"#O+'(")#"'2#-%2%#"-#)023)02"
dintr-0"$0)%$?3%"&#+".3!'2-un array:
SetH"$0)%$?3%"$#2%"!+"*0#'%"$0!?3!%"-#)023".+*)3$#'%4
6+7".87#29#!&*:H"0"$0)%$?3%"02.0!#'("$%"*0#'%"$0!?3!%"@3"-#)023".+*)3$#'%4"G+*)3,%!'#2"7#?(".%"
E0))%$'30!8"53&'"07%2("+!%)%"7#$3)3'(?3H"#$$%&"*0<3?30!#)":get(int index), set(int index, E
%)%,%!'998"$(+'#2%":indexOf, lastIndexOf), Iteration8"3!'%27#?("$#2%"%/'3!.%"I!'%2#'02"
(hasPrevious, previous, nextIndex, previousIndex, set, add).
QueueH"$0)%$?3%"$%"2%?3!%"%)%,%!'%)%";!#3!'%".%"#"73"*20$%&#'%4
D#'023'("7#*'+)+3"$("*%%R"@3"*0))"2%'+2!%#<("-#)0#2%#"!+))"$+"+!"#!+,3'"&%!&8"3,*)%,%!'(23)%"3!'%27%?%3"
Queue nu permit în general inserarea elementelor nule.
4.3.2. 4-,.!-!)#6$%.!+(5!$%#!
12
Paradigme de Programare
Laboratorul 4
4.4. Tema
E0!$%*%?3"0"3!'%27#?("Stack $#2%"&("#6&'2#$'3<%<%"7+!$?30!#2%#"+!%3"&'3-%4"L7%23?3"@3"0"
3,*)%,%!'#2%".%7#+)'"#"#$%&'%3"#6&'2#$'3<(234"=%!'2+"#"*+'%#"70)0&3"#$%#&'("&'3-("$+"023$%"'3*+23"
.%".#'%"70)0&3?3"'3*+23)%"1%!%23$%4
D%73!3?3",#3";!'>3"0"3!'%27#?("Stack $#2%"&("$0!?3!("+2,('0#2%)%",%'0.%H
isEmpty, isFullH".0+(",%'0.%"*23!"$#2%"&%"'%&'%#<(")3,3'%)%"$#*#$3'(?33"&'3-%3
push (offer9H"&%"3!'20.+$%"+!"%)%,%!'";!"&'3-(4"D#$("&'3-#"%&'%"*)3!(8"*23,#",%'0.("-#"
1%!%2#"%/$%*?3#"=",253<))>?2#(&+/! !"#$!#!%&'#!(#!$)*'$+#!(#,&#$)#!,&-"./!false.
pop (poll)0!1)!)2*$#-)!'+!),)3)+*!%"+!1*"(/4!5#./!1*"(#!)1*)!-&#,/ !6$"3#!3)*&%/!(#!
-)+)$#!)2.)67"#!StackEmptyException, iar a doua va returna valoarea null.
peek (element)0!1)!&87"+)!(#,&#$)#!%"+!(9$:',!1*"()"!:/$/!.#!#.)#1*#!1/!:")!;*)#$1/!%"+!
1*"(/4!<+!3&%!1"3",#$!1)!-)+)$)#=/!>*#.?@36*A@2.)67"&+!1#'!1)!$)*'$+)#=/!+',,4!
B(9+%!C+!()%)$)!./!#*'+."!.9+%!1)!&87"+!(#,&$"!%"+!1*"(/!1)!:&,&1);*)!+',,!.'!'+!1)+1!
anume, vom interz".)!"+*$&%'.)$)#!(#,&$",&$!+',,!C+!1*"(/ !&!#1*:),!%)!*)+*#*"(/!:""+%!
1)3+#,#*/!6$"+*$-&!)2.)67")!StackInvalidArgumentException.
D)+*$'!%):"+"$)#!*"6'$",&$!%)!)2.)67""!)2*"+%)7"!.,#1#!Exception ;"!%):"+"7"!3)*&%),)!toString
;"!getMessage.
5):"+";"!&!.,#1/!.#$)!1/!"36,)3)+*)=)!"+*)$:#7#!>*#.?4!D)+*$'!$)7"+)$)#!"+*)$+/!#!(#,&$",&$!
:&,&1"7"!'+!#$$#A!E6'*)7"!+'3"!.,#1#!ArrayStack). Clasa va avea un constructor prin care se va
specifica capacitatea stivei.
13
Paradigme de Programare
Laboratorul 3
Laboratorul 3
3.1. Diagrama de obiecte
!"#$"%"&'(&)*!(+,(&-".&'(&!/-,"/01&(-,(&2)3)-!,1&4(/,$.&)*-($5"$("&!/-,"/0(3)$&'(&)*!(+,(&6!&"&$(3"0!!3)$&
'!/,$(&(3(&4(/,$.&(7(%43(&+)/+$(,e. Aceast1 diagram1 4oate sur4rinde obiectele din memorie la un
anumit moment în e7ecu0ia a4lica0iei.
1
Paradigme de Programare
Laboratorul 3
Dac1 4anourile nu sunt 5i9ibile se 4oate 2ie schimba 4ers4ecti5a ?Resource@= 2ie a2i6a 4anoul res4ecti5
din meniu: Window -> Show View -> Other -> General.
2
Paradigme de Programare
Laboratorul 3
3
Paradigme de Programare
Laboratorul 3
3.3. Tema
;$)!(+,"0! )&"43!+"0!(&+"$(&-1 4($%!,1&#(-,!)/"$("&./.!&%"#"9!/&'(&+"3+.3",)"$(> B!(+"$(&4$)'.-&,$(*.!(&
-1&"!*1&.$%1,)"$(3(&+"$"+,($!-,!+!C&2!$%1 4$)'.+1,)"$( ?D(-,($/& !#!,"3@=&nume ?E"5!"$&F$((/&;)G($@=&
model ?D HIIIJJ K@ 6!&4$(0. În 2./+0!(&'(&,!4&4$)'.-ele ".&:/&43.-&4$)4$!(,10!3(C
J43!+"0!"&,$(*.!(&-1&4($%!,1&.$%1,)"$(3(&)4($"0!!C
J'1.#"$("&'(&4$)'.-(&:/&-,)+.3&%"#"9!/.3.!>
\($!2!+"$("&'"+1&./&"/.%!,&4$)'.-&(-,(&'!-4)/!*!3&?-(&'".&4$)'.-.3&6!&+"/,!,",("@>
K+[!%*"$("&4$(0.3.!&4$)'.-(3)$&'!/&-,)+>
J2!6"$("&4$)'.-(3)$&'!/&-,)+>
J'1.#"$("&'(&4$)'.-(&:/&+)6.3&+3!(/,.3.!>
K+)",($("&'(&4$)'.-(&'!/&+)6.3&+3!(/,.3.!>
E.%41$"$("&4$)'.-(3)$&'(&+1,$(&+3!(/,&?!%43!+1&-+)",($("&$(4(+,!5(3)$&4$)'.-(&'!/&-,)+.3&
%"#"9!/.3.!@>
J2!6"$("&4$)'.-(3)$&+.%41$",(&'(&+1,$(&+3!(/,&6!&4$(0.3&,),"3>
4
Paradigme de Programare
Laboratorul 3
Se cere:
H
Paradigme de Programare
Laboratorul 2
Laboratorul 2
2.1. Limbajul Java
2.1.1. Introducere
Tehnologia Java !" #$%#&' (&)*#"*+,#-%#(*+.&/#0 #,1231&+&1 #)*#2#,(&"421+56
Limbajul de programare Java este un limbaj de nivel înalt ce poate fi caracterizat de multe atribute:
21* %"&"#2.* '"7#!*+,(-7#0*%&+*'7#,21"&.*(7#*%0 , %0 %"#0 #&18*" '"-157#12.-!"7#0*!"1*.-*"6#920-(#!-1!5#
!" #!'1*!#$%#4*)* 1 #" :"#'-# :" %!*&#;6/&<&=6#>' !" #4*)* 1 #!-%"#'2+,*(&" cu compilatorul javac în
4*)* 1 #;6'(&!!=6#?*)* 1 ( #'2+,*(&" #%-#'2%@*%#'20#%&"*<#,12' !21-(-*#'*#'2%@*%#;bytecode”, limbajul
+&)*%5#42(2!*"#0 #A&<&#B*1"-&(#C&'8*% #DABCE6#>,(*'&@**( #/&<&#!-%"#(&%!&" #$%#'&01-(#-% *#*%!"&%@ #
JVM prin utilitarul java. JVM este disponibil pe multe sisteme de operare (Windows, Solaris, Linux,
C&'E7#0 #-%0 #1 F-("5#'5#)*#&,(*'&@**( #/&<� /&#'2+,*(&" #,2"#1-(&#, #&' !" #!*!" + #4515#&#+&*#4*#
% ' !&15#1 '2+,*(&1 &#'20-(-*#!-1!56
G#,(&"421+5# !" #-%#+ 0*-#D8&10#!&-#!24"E#$%#'&1 #2#&,(*'&@* #1-( &F56#C-(" #&!"4 (#0 #,(&"421+ #!-%"#2#
'2+.*%&@* #$%"1 #!*!" +-(#0 #2, 1&1 #)*#!-,21"-(#8&10#, #'&1 #1-( &F5H#I*%02J!7#K*%-:#L6#Platforma
Java !" #-%#"*,#0*4 1*"#0 #,(&"421+5#D02&1#!24"E#'&1 #1-( &F5#, #&' !" #,(&"421+ #+ %@*2%&" #&%" 1ior.
M #0 0-' #0 '*#'&#/&<&# !" #2#,(&"421+5#*%0 , %0 %"5#0&1#)*#4&,"-(#'5#,2&" #4*#-%#,*'#+&*#( %"5#0 'N"#
'20-(#%&"*<#0 #, #,(&"421+ ( #0 #.&F56#O(&"421+&#&1 #02-5#'2+,2% %" H#JVM (Java Virtual Machine)
)*#Java API (Application Programming Interface). API--(#A&<&# !" #2#'2( '@* #0 #'2+,2% %" #0 /&#
'1 &" #'&1 #,2"#24 1*#+-(" #4-%'@*2%&(*"5@*#-"*( 6#>' !" #(*.151**#!-%"#31-,&" #$%#(*.151**#0 #'(&! #)*#
*%" 14 @ #$%1-0*" H#packages.
2.1.2. Variabile
P%#A&<&# :*!"5#-1+5"2&1 ( #"*,-1*#0 #<&1*&.*( H
1
Paradigme de Programare
Laboratorul 2
Variabile locale. Variabile temporare declarate în cadrul unei metode. Sunt vizibile doar în
cadrul acelei metode.
Parametri. Variabilele prin care se trimit argumente la apelul metodelor.
4-&5%&+"" de denumire
Numele variabilelor sunt „case-! %!*"*< =#)*#,2"#4*#21*' #identificator legal: orice lungime,
'*41 #)*#'&1&'" 1 #Unicode7#"1 .-* #!5#$%' &,5#'-#-%#'&1&'" 17#QRS#!&-#’_’.
M #'2%<*% #'&#%-+ ( #<&1*&.*( (21#!5#1 !, '" #&-')+")#4)66%,: ex. „getCurrentValue”.
O %"1-#<&1*&.*( ( #'2%!"&%" #! #'2%<*% #2#%2"&@* #0 #3 %-(H#;TUCVWXYG?YXGIM=6
boolean false
Arrays
U%#&11&`#D< '"21E# !" #-%#'2%"&*% 1#'&1 #'2%@*% #-%#%-+51#4*:#0 #<&(21*#0 #&' (&)*#"*,6#Lungimea
< '"21-(-*# !" #!"&.*(*"5#(&#'1 &1 &#!&7#0-,5#'&1 #15+N% #4*:56#U%#2.* '"#0*%#&11&`#! #%-+ )" #element.
Declarare
int[] numbers;
4!%)!%#8"#"&"+"),".)!%
numbers = new int[10];
numbers[0] = 0; …
2
Paradigme de Programare
Laboratorul 2
9"&')73#$!%2( !')'3
int[] numbers = {0, 1, 2, 3};
Copierea vectorilor
M #42(2! )" #+ "20&#arraycopy din package-ul System:
public static void arraycopy(Object src, int srcPos, Object dest, int
destPos, int length)
2.1.3. Operatori
G, 1&"21**#!-%"#!*+.2(-1*#!, '*&( #'&1 # : '-"5#2, 1&@**#!, '*4*' #&!-,1&#-%-*#%-+51#0 #[7#^#!&-#]#
operanzi.
1) !"#$%&#'()*")$%#+,'+#")-+.!(/
int number = 0;
char ch = ‘A’;
String s = “a string”;
2) Operatori aritmetici
+, - !" !#!$%&'()*+),!%-.),/0(1 !2!$),3.45!%&'()*+)++1
3
Paradigme de Programare
Laboratorul 2
3) Operatori unari
+, -, ++, --, !(complementar logic)
4) !"#$%&#++)*")"0$(+%$%")1+)&!"#$2+&3$(+
==, !=, >, >=, <, <=
5) !"#$%&#''()&*+','&*$-'
&&(AND), ||(OR)
!"#$%&'(")*$')%&+,-!.%'-"*/0&()%-&1!,)$!%)!,%$*)"2&*3&4'%3"*&'(")*-4&3'5%!&6*%&"1$"&"7*3,*$&-,6*%&4*!0&
mai poate schimba valoarea rezultatului.
? : (ternar)
8(")*$'),3&$")-*)&"1$"&'&+')60&()"1!,)$*$0&*&,-"%&%-1$),!.%,-%&4"&5"-,3&if-then-else.
9'6(*)0&,-&':%"!$&!,&,-&$%(&1("!%+%!*$;&8:%"!$,3&('*$"&+%&#%&'&%-1$*-.0&*&,-"%&1,:!3*1"&*&$%(,3,%&4*$;&<"&
)".%-,$&!0&-,33&-,&"1$"&%-1$*-.*&-%!%&,-,%&$%(;
7) !"#$%&#'(!"(.','
!"#$%&'%()*+,"-""./+00/+11/+111!2%34('(&%+2&%(35(+6*&*+'%7#./+8!9:;./+
^(XOR), |(OR)
2.1.4. !"#$%&&'(&)%*#+,-&+)&(.&(/01,+#&
8(")*$')%%&('$&+%&+'3'1%.%&=n construirea expresiilor>&!*)"&1,-$&()'!"1*$"&#%&*,&7*3')%;&?@()"1%%3"&1,-$&
componentele elementare din !"#$%&' %! (statementsA>&%*)&%-1$),!.%,-%3"&('$&+%&5),(*$"&3*&)B-4,3&3')&
în blocuri.
1) Expresiile
?@()"1%%3"&1,-$&!'6(,1"&4%-&7*)%*:%3">&'(")*$')%&#%&apeluri de metode care sunt evaluate într-'&1%-5,)0&
valoare.
int nr = 10;
array[10] = 10;
C%(,3&4"&4*$0&*3&7*3')%%&)"$,)-*$"&4"&'&"@()"1%"&4"(%-4"&4"&"3"6"-$"3"&+'3'1%$";&?@()"1%%&!'6(,1"&1"&
('$&+')6*&4%-&"@()"1%%&6*%&6%!%>&!,&!'-4%.%*&!*&$%(,)%3"&4"&4*$0&)"$,)-*$"&4"&"@()"1%%3"&+'3'1%$"&10&1"&
('$)%7"*1!0&!,&!"3"&-"!"1*)"&=-&!'-1$),%)"*&"@()"1%"%&!'6(,1";
nr = 1 * 2 * 3;
rez = (x + y) / z;
4
Paradigme de Programare
Laboratorul 2
2) /*0%#1),'1*'-"(20%$%"3"*%04
8&%-1$),!.%,-"&+')6"*/0&'&,-%$*$"&4"&"@"!,.%"&!'6(3"$0;& $)%:,%)%3">&+'3'1%)%3"&'(")*$')%3')&DD&--,
*("3,)%3"&4"&6"$'4"&#%&!)"0)%3"&4"&':%"!$"&1,-$& !"#$%&' %! ()*+$)" ).
nr = 10; //atribuire
nr++; //incrementare
System.out.println(“mesaj”); //apel met<2*
String s = new String(); //creare obiect
3) Blocuri
F-&:3'!&4"&!'4&"1$"&,-&5),(&4"&G&1*,&6*%&6,3$"&%-1$),!.%,-%&!,()%-1"&=-$)"&*!'3*4";&H3'!,)%le pot fi
+'3'1%$"&')%,-4"&"1$"&(")6%10&4'*)&'&1%-5,)0&%-1$),!.%,-";
if (expr) { //bloc 1
… =='%5+"#'5&?>-"?#"
} else { //bloc 2
… =='%5+"#'5&?>-"?#"
}
2.1.5. 2)%*#+,-&+)&(3$(,1)*#10
I-&6'4&-')6*3&%-1$),!.%,-%3"&1!)%1"&=-&!'4,3&1,)10&J*7*&1,-$&"@"!,$*$"&4"&1,1&=-&J'1>&=-&')4%-"*&=-&!*)"&
apar. Acest comportament poate fi modificat prin !"#$%&' %! -)(,)(&/!#$/-0 care permit luarea
4"!%/%%3')>&"@"!,.%%3"&=-&:,!30>&=6(0).%)"*&!'4,3,%&=-&)*6,)%>&"@"!,$*)"*&!'-4%.%'-*$0&*&,-')&(').%,-%&4"&
cod.
1) If-then
K-1$),!.%,-%3"&4%-&:3'!,3&%+-$L"-&1,-$&"@"!,$*$"&-,6*%&4*!0&"@()"1%*&3'5%!0&"1$"&"7*3,*$0&3*&7*3'*)"*&
:''3"*-0&$),";
"6+!%@3&.+"#'5&?>-"?#%A
if (expr) {
"#'5&?>-"?#""A
}
2) If-then-else
M"&'+")0&('1%:%3%$*$"*&4"&"@"!,.%"&*&,-')&%-1$),!.%,-%&#%&!B-4&"@()"1%*&"1$"&"7*3,*$0&3*&7*3'*)"*&+*31";
"6+!%@3&.+++"#'5&?>-"?#%A
%4'%++"#'5&?>-"?#%A
if (expr) {
"#'5&?>-"?#"A
} else {
"#'5&?>-"?#"A
}
5
Paradigme de Programare
Laboratorul 2
N"!'6*-4*)"*&!,&()%7%)"&3*&+'3'1%)"*&*!'3*4"3')&)06B-"&7*3*:%30&("-$),&*6:"3"&:3'!,)% ale
%-1$),!.%,-%%;
3) Switch
8+")0&')%!"&-,60)&4"&!0%&4"&"@"!,.%";&O*)%*:%3"3"&*(3%!*:%3"&('$&+%&4"&$%(,)%3"&:P$">&1L')$>&!L*)&1*,&%-$;&
M"&*!!"($0&4"&*1"6"-"*&$%(,)%&"-,6")*:%3"&#%&!3*1"&1("!%*3"&!*)"&6*("*/0&$%(,)%&()%6%$%7"2&9L*)*!$")>&
H/$">&ML')$&#%&K-$"5er.
int sw = 3;
switch (sw) {
case 1:
>('%+BC+"#'5&?>-"?#"A
break;
>('%+DC+"#'5&?>-"?#"A
break;
2%6(?45C+"#'5&?>-"?#"A
break;
}
C)":,%"&)"6*)!*$0&+%"!*)"&%-1$),!.%,-"&break +'3'1%$0;& !"1$"*&4"$")6%-0&$")6%-*)"*&"@"!,.%"%&
inst),!.%,-%%&1Q%$!L;&R,6*%&=-&!*/,3&=-&!*)"&1"&4')"#$"&#%&"@"!,$*)"*&:3'!,3,%&!*1"&,)60$')&1"&'6%$"&
:)"*S&3*&1+B)#%$,3&:3'!,3,%&!*1"&!,)"-$;
4) 56'-"(7'(+&-while
H3'!,3&QL%3"&"1$"&"@"!,$*$&=-&:,3!0&*$B$&$%6(&!B$&"@()"1%*&"7*3,*$0&"1$"&*4"70)*$0;&T'3'1%-4&QL%3"&1e
pot implementa bucle infinite.
while (expr) {
"#'5&?>-"?#"A
}
8&:,!30&4'-QL%3"&"1$"&*1"60-0$'*)">&4'*)&!0&$"1$,3&"@()"1%"%&1"&+*!"&3*&,)60>&:3'!,3&"@"!,$B-4,-se cel
(,.%-&'&4*$0;
do {
"#'5&?>-"?#"A
} while (expr);
5) For
8&%-1$),!.%,-"&!'6(*!$0&()%-&!*)"&1"&('$&%$")*&'&1")%"&4"&7*3')%;&T')6*&5"-")*30&*&%-1$),!.%,-%%&"1$"2
6<&+!"#"-"(4")(&%A+><#2"-"%A+"#>&%7%#5(&%.+E
"#'5&?>-"?#"A
}
8&*3$0&+')60&+*!%3%$"*/0&(*)!,)5")"*&7"!$')%3')&U*))*P1A&#%&*&!'3"!.%%3')2
6) Break
K-1$),!.%,-"*&:)"*S&$")6%-0&"@"!,.%*&!"3"%&6*%&%-$")%'*)"&%-1$),!.%,-%&4"&$%(,3&1Q%$!L>&+')>&QL%3"&1*,&
do-while. Pentru a se termina execu.%*&,-"%&:,!3"&"@$")%'*)"&1"&+'3'1"1!&%-1$),!.%,-%3"&break cu
)# &1)#2.
6
Paradigme de Programare
Laboratorul 2
outer:
for (…; …; …) {
for (…; …; …) {
…; break outer;
}
}
I-&*!"1$&!*/&"1$"&$")6%-*$0&"@"!,.%*&:,!3"%&"$%!L"$*$0&!,&"$%!L"$*&)"1("!$%70;&T%),3&"@"!,.%"%&*J,-5"&3*&
%-1$),!.%,-"*&%6"4%*$&,)60$'*)"&*!"1$"%&:,!3"&"$%!L"$*$">&#%&-,&3*&"$%!L"$0;
7) Continue
!"#$%&'(%!)*+&,!#(!%)+#)$-(!.+)/)&%'(*+(#)$*'()(+&%$)!#)+*+%!)(+0%&1)2+3)#)$-(!4!3+$)1%*$)*+&,$5%1%(+
0%&1)(+3)+1*+%$-.#,*$)*+(#)$*'()2+3*&.+*&)*"#*+)/("#.6+7)+*51(&.+1*+(!"#$%&'(%!(1)+8,$2+9:(1)+;(+3,-while.
<)!#$%+#)$-(!*$)*+)/)&%'()(+(#)$*'()(+&%$)!#)+*+%!)(+0%&1)+)/#)$(,*$)2+")+8,1,");#)+(!"#$%&'(%!)*+
!"#$"%&' %'&#$ (&#).
outer:
for (…; …; …) {
for (…; …; …) {
…; continue outer;
}
}
8) Return
=)#)$-(!.+#)$-(!*$)*+)/)&%'()(+-)#,3)(+&%$)!#)2+8($%1+)/)&%'()(+$)1%4!3%-se din punctul unde metoda
*+8,"#+*5)1*#.6
>)#%$!+-*(+*$)+;(+$,1%1+3)+*+$)#%$!*+,+?*1,*$)6+@(5%1+*&)"#)(*+#$)0%()+".+&,$)"5%!3.+&%+&)1+5$)&(A*#+1*+
3)&1*$*$)*+-)#,3)(6+=*&.+#(5%1+3)+$)#%$!*$)+)"#)+?,(32+*#%!&(+(!"#$%&'(%!)*+$)#%$!+!%+-*(+*$)+!(&(+%!+
parametru.
2.1.6. Clase
1) !"#$%$&''()!("#$*!
class MyClass {
//câmpuri
//constructori
!"#$%$&''(!)(*)+,!)
}
B&)*"#*+)"#)+,+3)&1*$*'()+3)+&1*".+"(-51.6+Corpul clasei2+&%5$(!"+C!#$)+*&,1*3)2+&,!'(!)+#,#+&,3%1+
!)&)"*$+&(&1%1%(+3)+?(*'.+*1+,0()&#)1,$+(!"#*!'(*#)D+&,!"#$%&#,$(+5)!#$%+&$)*$)*+;(+(!('(*1(A*$)*+3)+
(!"#*!')2+3)&1*$*'((+3)+&4-5%$(+&*$)+3*%+starea &1*")(+;(+*+,0()&#)1,$+;(+-)#,3)1)+&*$)+(-51)-)!#)*A.+
comportamentul &1*")+;(+*1+,0()&#)1,$6
=)&1*$*'(*+3)+&1*".+*!#)$(,*$.+)"#)+%!*+-(!(-*1.6+E*+5,*#)+8(+)/#(!".+5$(!+5$)&(A*$)*+&1*")(+3)+0*A.+"*%+
*+(!#)$8)')1,$+(-51)-)!#*#)D
7
Paradigme de Programare
Laboratorul 2
2) Variabile membre
=)&1*$*'((1)+3)+câmpuri "%!#+&,-5%")+3(!+%!%1+"*%+-*(+-%1'(+modificatori (public, private,...), tipul
;(+!%-)1)+?*$(*0(1)(6
3) Metode
Public void doAction(int param1, double param2) {
'-.+%/"&'/-'
}
B&)*"#*+)"#)+)+,+3)&1*$*'()+-(!(-*1.+3)+-)#,3.6+E1)-)!#)1)+-(!(-)+!)&)"*$)+1*+3)&1*$*$)*+%!)(+
metode "%!#+#(5%1+$)#%$!*#2+!%-)1)+-)#,3)(2+1("#*+)+G+"*%+-*(+-%1'(+5*$*-)#$(+;(+&,$5%1+-)#,3)(6
<)+14!F.+*&)"#)*2+3)&1*$*'(*+%!)(+-)#,3)+-*(+5,*#)+&,!'(!)+-,3(8(&*#,$(+3)+*&&)"+H5$(?*#)2+5%01(&2666I+;(+
o *$+#)',&'&- &./$$ pe care metoda le-ar putea arunca.
K%-)1)+-)#,3)1,$+5,#+8(+,$(&)+(3)!#(8(&*#,$2+3*$+&,!?)!'((1)+"%F)$)*A.+&*+*&)"#)+!%-)+".+$)"5)&#)+
!,#*'(*+L*-)1+;(+".+"*+C!&)*5.+&%+?)$0%1+&*$)+3)"&$()+*&'(%!)*+(-51)-)!#*#.+3)+-)#,3.6
34+&051/$&D+M5*$*-)#$(N+")+$)8)$.+1*+1("#*+3)+?*$(*0(1)+3(!+3)&1*$*'(*+-)#,3)(2+(*$+!,'(%!)*+3)+
„argumenteN+")+$)8)$.+?*1,$(1)+)8)&#(?)+&*$)+"%!#+5$(-(#)+*#%!&(+&4!3+-)#,3*+)"#)+*5)1*#.6
<*$*-)#$((+%!)(+-)#,3)+5,#+*?)*+,$(&)+#(52+*#4#+#(5%$(+5$(-(#(?)+&4#+;(+#(5%$(+$)8)$(!'.6+B1#)+1(-0*O)+3)+
5$,F$*-*$)+H)/6+LPLQQI+5,#+#$(-(#)+1*+*5)1%1+-)#,3)1,$+$)8)$(!')+1*+*1#)+-)#,3)6+R!+S*?*+!%+")+5)$-(#)
,+*"#8)1+3)+#):!(&.2+3*$+")+5,*#)+#$(-(#)+3)+)/)-51%+%!+,0()&#+*1)+&.$%(+-)#,3)+5,#+8(+*5)1*#)+*5,(+C!+
cadrul metodei.
7)+,0")$?.+8,1,"($)*+&%?4!#%1%(+&:)()+this6+B&)"#*+)"#)+,+$)8)$(!'.+&.#$)+,0()&#%1+&%$)!#2+,0()&#%1+*+
&.$%(+(!"#*!'.+*+8,"#+8,1,"(#.+5)!#$%+*5)1*$)*+-)#,3)(6+
E/)&%'(*+%!)(+-)#,3)+")+C!#,*$&)+1*+&,3%1+3)+%!3)+*+8,"#+*5)1*#.+*#%!&(+&4!3+#)$-(!.+3)+)/)&%#*#+#,*#)+
(!"#$%&'(%!(1)+"*%+*O%!F)+1*+,+(!"#$%&'(%!)+return "*%+*$%!&.+,+)/&)5'()6+W+-)#,3.+&*$)+$)#%$!)*A.+
altceva decât void #$)0%()+".+&,!'(!.+,+(!"#$%&'(%!) de tipul return value;6+=*&.+$)#%$!)*A.+?,(3+")+
5,*#)+8,1,"(+1*+!)?,()+$)#%$!+8.$.+5*$*-)#$%2+3*$+)/("#)!'*+*&)"#)(+(!"#$%&'(%!(+!%+)"#)+,01(F*#,$()6+
V*1,*$)*+$)#%$!*#.+#$)0%()+".+&,$)"5%!3.+&%+#(5%1+3)+$)#%$!*$)+3(!+3)&1*$*'(*+-)#,3)(6+W0()&#%1+
returnat #$)0%()+".+8()+)/*&#+3)+#(5%1+&1*")(+3)&1*$*#)+"*%+(!"#*!'.+*+%!)(+&1*")+3)$(?*#)+3(!+&1*"*+
3)&1*$*#.6+7)+5,#+3)&1*$*+&*+#(5%$(+3)+$)#%$!*$)+"(+(!#)$8)')6+R!+*&)"#+&*A+,0()&#%1+$)#%$!*#+#$)0%()+".+8()+,+
(!"#*!'.+*+%!)(+&1*")+&*$)+(-51)-)!#)*A.+*&)*+(!#)$8*'.6
4) Constructori
=)&1*$*'((1)+&,!"#$%&#,$(1,$+"%!#+*")-.!.#,*$)+3)&1*$*'((1,$+-)#,3)1,$2+&%+)/&)5'(*+8*5#%1%(+&.+!%+*%+%!+
#(5+$)#%$!*#+(*$+!%-)1)+#$)0%()+".+&,(!&(3.+&%+!%-)1)+&1*")(6
class Line {
...
public Line(Point p1, Point p2) {
this(p1.x, p1.y, p2.x, p2.y);
}
public Line(int x1, int y1, int x2, int y2) {
...
}
<$,F$*-*#,$%1+!%+)"#)+,01(F*#+".+3)&1*$)+&,!"#$%&#,$(+5)!#$%+&1*"*+"*6+L,-5(1*#,$%1+&$))*A.+*%#,-*#+%!+
constructor implicit2+8.$.+5*$*-)#$(6+B&)"#*+)"#)+&$)*#+!%-*(+*#%!&(+&4!3+!%+")+&$))*A.+!(&(+%!+
constructor explicit.
9
Paradigme de Programare
Laboratorul 2
7)+5,#+8,1,"(+-,3(8(&*#,$(+3)+*&&)"+;(+C!+&*A%1+&,!"#$%&#,$(1,$6+=*&.+,+&1*".+!%+*$)+*&&)"+1*+!(&(+%!+
&,!"#$%&#,$+*1+%!)(+&1*")(2+*#%!&(+*&)*"#*+!%+5,*#)+&$)*+3($)&#+(!"#*!')+*1)+&1*")(+$)"5)&#(?)2+&(+!%-*(+
printr-,+-,3*1(#*#)+,8)$(#.+)/51(&(#+3)+&.#$)+5$,F$*-*#,$+H*;*+&%-+")+C!#4-51.+C!+&*A%1+5*##)$!-ului
Singleton).
5) Controlul accesului
L,!#$,1%1+*&&)"%1%(+1*+&1*")+"*%+1*+*!%-('(+-)-0$(+*1)+&1*")1,$+")+8*&)+&%+*O%#,$%1+-,3(8(&*#,$(1,$+3)+
*&&)"6+B&);#(*+"%!#+1*+!(?)1+3)+&1*".+"*%+1*+!(?)1+3)+-)-0$%6
U$-.$('(+C!+#*0)1%1+%$-.#,$+*&&)"(0(1(#*#)*+,8)$(#.+3)+8()&*$)+-,3(8(&*#,$D
6) +,'&'$#'-.%'
!('(*1(A.$(1)+?*$(*0(1)1,$+"#*#(&)+")+5,#+8*&)+5$(!+"(-51)+*#$(0%($(+*#%!&(+&4!3+")+&%!,"&+)/*&#+?*1,$(1)+
(!('(*1)6+=*&.+*&)"#)+?*1,$(+!)&)"(#.+&*1&%1)+-*(+&,-51(&*#e atunci se pot folosi blocurile statice de
$"$/$1*$810&.
static {
",!(!)('-'&'$#'1$%)
}
O *1#)$!*#(?.+1*+01,&%$(1)+"#*#(&)+)"#)+8,1,"($)*+-)#,3)1,$+"#*#(&)+5$(?*#)6
...
public static int nr = initStaticNr();
private static int initStaticNr() {
",!('-'&'$#'1$%)
}
...
10
Paradigme de Programare
Laboratorul 2
B?*!#*O%1+8,1,"($((+*&)"#,$+-)#,3)+)"#)+&.+?*$(*0(1)1)+5,#+8(+$)(!('(*1(A*#)+1*+!)?,()+8,1,"(!3+*&)1*;(+&,36
{
",!('-'&'$#'1$%)
}
=)+*")-)!)*+)/("#.+,+*1#)$!*#(?.+;(+1*+*&)"#)+01,&%$(D+-)#,3)1)+3)+(!"#*!'.+8(!*1)6+J,3(8(&*#,$%1+final
C-5()3(&.+,+-)#,3.+".+8()+"%5$*"&$(".+C!#$-,+&1*".+3)$(?*#.6
B5)1%1+-)#,3)1,$+&*$)+!%+"%!#+8(!*1)+C!+#(-5%1+(!('(*1(A.$((+(!"#*!')(+5,*#)+&$)*+5$,01)-)2+-,#(?+5)!#$%+
&*$)+-)#,3*+3)+(!('(*1(A*$)+*+8,"#+3)&1*$*#.+8(!*1.6
2.1.7. Obiecte
1) Crearea obiectelor
Line line = new Line(point1, point2);
B&)*"#.+(!"#$%&'(%!)+&,!'(!)+Z+5.$'(D+=)&1*$*$)*+?*$(*0(1)(2+(!"#*!'()$)*+,0()&#%1%(+;(+(!('(*1(A*$)*+
variabilei cu obiectul creat.
!"#*!'()$)*+&1*")(+)"#)+$)*1(A*#.+5$(!+,5)$*#,$%1+new6+B&)"#*+*1,&.+-)-,$()+5)!#$%+!,%1+,0()+
*5)1)*A.+&,!"#$%&#,$%1+5,#$(?(#+;(+$)#%$!)*A.+,+$)8)$(!'.+1*+A,!*+3)+-)-,$()+*1,&*#.6+L,!"#$%&#,$%1+)"#)+
*1)"+3%5.+"(F!*#%$.2+(*$+!%-)1)+&1*")(+)"#)+3*#+3)+!%-)1)+&,!"#$%&#,$%1%(6
De obicei operatorul new este folosit pentru atribuirea obiectului nou creat unei variabile, dar acest
1%&$%+!%+)"#)+,01(F*#,$(%6+>)8)$(!'*+$)#%$!*#.+3)+,5)$*#,$+5,*#)+8(+8,1,"(#.+3($)&#+C!+)/5$)"((D
B&)"#+,0()&#+&$)*#+!%+*$)+!(&(+,+$)8)$(!'.+&.#$)+)1+(*$+3%5.+)/)&%#*$)*+(!"#$%&'(%!((+$)"%$")1)+"*1)+5,#+8(+
eliberat)+3)+&.#$)+-*;(!*+?($#%*1.6
2) /!01%'()!("#$*.(2'(0!01%'()!(',*3$,&.
L4!3+-*(+-%1#)+,0()&#)+"%!#+(!"#*!'(*#)+3(!+*&))*;(+&1*".+8()&*$)+,0()&#+&$)*#+*$)+,+&,5()+5$,5$()+*+
510$14$*&*!0',&'$"+#1"/)6+L4!3+")+3,$);#)+&$)*$)*+%!,$+?*$(*0(1)+&,-%!)+#%#%$,$+,0()&#)1,$+")+
8,1,");#)+-,3(8(&*#,$%1+static. Acestea sunt 6&640$',&' *1+) ;(+")+!%-)"&+câmpuri statice. Fiecare
,0()&#+5,*#)+*?)*+*&&)"+1*+-)-0$((+"#*#(&(+*(+&1*")1,$2+3*$+*&);#(*+5,#+8(+-*!(5%1*'(+;(+8.$.+*+(!"#*!'(*+
clasa.
class Line {
public static int maxLength = 100;
...
}
...
Line.maxLength = 200;
11
Paradigme de Programare
Laboratorul 2
7)+5,*#)+*&&)"*+%!+&4-5+"#*#(&+;(+8,1,"(!3+,+(!"#*!'.+*+&1*")(+3*$+*&)*"#.+5$*&#(&.+!%+)"#)+$)&,-*!3*#.+
3),*$)&)+!%+)"#)+?(A(0(1+&.+)"#)+?,$0*+3)"5$)+,+?*$(*0(1.+3)+&1*".6
B")-)!)*+?*$(*0(1)1,$+3)+&1*".+")+5,#+3)&1*$*+;(+6&#!,&',&' *1+).
În concluzie:
-)#,3)1)+3)+(!"#*!'.+5,#+*&&)"*+3($)&#+-)#,3)1)+;(+?*$(*0(1)1)+3)+(!"#*!'.+;(+&)1)+3)+&1*".6
-)#,3)1)+3)+&1*".+5,#+*&&)"*+3($)&#+-)#,3)1)+;(+?*$(*0(1)+3)+&1*".6
-)#,3)1)+3)+&1*".+KU+5,#+*&&)"*+3($)&#+-)#,3)1)+;(+?*$(*0(1)1)+3)+(!"#*!'.2+)1)+#$)0%()+".+
8,1,")*"&.+C!+"&:(-0+(!"#*!')+*1)+&1*")(6+=)+*")-)!)*+&%?4!#%1+&:)()+this nu poate fi folosit în
-)#,3)1)+3)+&1*".+H!%+)/("#.+!(&(+,+(!"#*!'.+1*+&*$)+#:("+".+$)8)$)I6
3) Constante
<)!#$%+*+3)8(!(+?*$(*0(1)+&,!"#*!#)+")+5,*#)+8,1,"(+-,3(8(&*#,$%1+"#*#(&+C-5$)%!.+&%+-,3(8(&*#,$%1+
final2+&*$)+(!3(&.+&*+?*1,*$)+?*$(*0(1)(+!%+5,*#)+8(+-,3(8(&*#.6
<$(!+&,!?)!'()2+!%-)1)+?*$(*0(1)1,$+&,!"#*!#)+")+"&$(%+&%+1(#)$)+-*$(+(*$+&%?(!#)1)+")+")5*$.+5$(!+[\[6
4) Gestionarea memoriei
U!)1)+1(-0*O)+3)+5$,F$*-*$)+,01(F.+5$,F$*-*#,$%1+".+'(!.+)?(3)!'*+,0()&#)1,$+&$)*#)+;(+".+)1(0)$)A)+
-)-,$(*+C!+-,3+)/51(&(#+*#%!&(+&4!3+*&)"#)+,0()&#)+!%+-*(+"%!#+8,1,"(#)6+B&)*"#.+F)"#(,!*$)+)/51(&(#.+
*+-)-,$()+)"#)+3(8(&(1.+;(+5,*#)+3%&)+&%+%;%$(!'.+1*+0ug-%$(6+<1*#8,$-*+S*?*+%!%(+!%-.$+!)1(-(#*#+3)+
,0()&#)+H1(-(#*#+3,*$+3)+&*5*&(#.'(1)+"("#)-%1%(I+8.$.+*+*?)*+F$(O.+3)+F)"#(,!*$)*+-)-,$()(6+Y*+)/)&%'()2+
&4!3+-*;(!*+?($#%*1.+&,!"#*#.+&.+%!+,0()&#+!%+-*(+)"#)+8,1,"(#2+)1(0)$)*A.+-)-,$(*+,&%5*#.+3)+*&)"#*6+
A&)"#+5$,&)"+")+!%-);#)+Garbage Collection.
U!+,0()&#+)"#)+&*!3(3*#+1*+&,1)&#*$)+*#%!&(+&4!3+!%+-*(+"%!#+$)8)$(!')+&.#$)+)16+>)8)$(!')1)+5."#$*#)+C!+
?*$(*0(1)+"%!#+;#)$")+*#%!&(+&4!3+?*$(*0(1*+!%+-*(+)/("#.+H()")+3(!+"&,5%1+3)+)/("#)!'.I+"*%+&4!3+
variabilei (+")+*#$(0%()+*1#.+?*1,*$)6+B"#8)1+")+5,*#)+$)!%!'*+)/51(&(#+1*+,+$)8)$(!'.+&.#$)+%!+,0()&#+5$(!+
atribuirea valorii null acelei variabile.
=*&.+%!+,0()&#+)"#)+$)8)$(#+3)+-*(+-%1#)+$)8)$(!')2+#,*#)+*&)"#)+$)8)$(!')+#$)0%()"&+;#)$")+5)!#$%+&*+
,0()&#%1+".+8(e un candidat la colectare.
2.1.8. Interfe !
!"#$!$%&'"(!)$%*$+$'$",-!)".&"!(/)$"0contracte” stabilite prin care diverse componente software
.12-!(.3"4!)%$"$'$5
!"6&7&"1"(!)$%*&+3"$,)$"-!")(8"%$*$%(!+39",(2('&%".'&,$(9".&%"81)".1!+(!$":1&%".1!,)&!)$9",(#!&)-%("de
2$)1:$"/(")(8-%("(2;%(.&)$"<!-"$=(,)3".1%8-%(":$"2$)1:3>5"?!)$%*$+$'$"!-"81)"*("(!,)&!+(&)$9"$'$"81)"*(":1&%"
implementate de clase sau extinse :$"&')$"(!)$%*$+$5"@$!)%-"&"*1'1,("1"(!)$%*&+3"&7$2"!$71($":$"1".'&,3"
.&%$",3"(28'$2$!)$A$"&.$&"(!)$%*&+3"<,3"1*$%$"-!".1%8"8$!)%-")1&)$"2$)1:$'$":$.'&%&)$"4!"(!)$%*&+3>9"(&%"
&81("8-)$2"*1'1,("(!,)&!+$"&'$"&.$'$(".'&,$(5
12
Paradigme de Programare
Laboratorul 2
!"6&7&"<*&+3":$"&')$"'(2;&B$>"1".'&,3"!-"81&)$":$%(7&":(!"2&("2-')$".'&,$9".(":1&%":(!"-!&5"?!)$%*$+$'$"
1*$%3"1"&')$%!&)(73"'&"&.$&,)3"*&.('()&)$9":$1&%$.$"1".'&,3"81&)$":$%(7&":(!)%-1",(!#-%3".'&,39":&%"81&)$"
(28'$2$!)&"A$%1",&-"2&("2-')$"(!)$%*$+$5
1) Declarare
C$.'&%&%$&"-!$("(!)$%*$+$".-8%(!:$"$7$!)-&'("21:(*(.&)1%(":$"&..$,9"1"$7$!)-&'3"'(,)3":$"(!)$%*$+$"
$=)(!,$"/(".1%8-'"(!)$%*$+$(5
F1&)$"2$)1:$'$":$.'&%&)$"4!".1%8-'"(!)$%*$+$(",-!)"(28'(.()"8-;'(.$9"8%(!"-%2&%$"21:(*(.&)1%-'"public
poate fi omis. Metodele sunt de asemenea implicit abstracte, dar modificatorul abstract poate lipsi.
Constantele declarate au implicit modificatorul public static final, acesta putând fi omis.
2) !"#$!$%&'($)*+),-#-.+($
DG!:"1".'&,3"(28'$2$!)$&A3"1"(!)$%*&+39"8%(!".1!7$!+($".-7G!)-'".H$($"implements /("'(,)&":$"(!)$%*$+$"
implementa)$",$"8-!$":-83"$=)$!:,9":&.3".'&,&"%$,8$.)(73"$=)(!:$"1"&')3".'&,35
I8-!$&2".3"1"(!)$%*&+3"$,)$"-!")(8"%$*$%(!+35"DG!:",$":$*(!$/)$"1"7&%(&;('3"%$*$%(!+3"&'".3%$(")(8"$,)$"1"
(!)$%*&+39"1%(.$"1;($.)".&%$"$,)$"&)%(;-()"&.$'$("7&%(&;('$")%$;-($",3"*($"1"(!,)&!+3"&"-!$(".'&,$".&%$"
(28'$2$!)$&A3"&.$&"(!)$%*&+35
DG!:",$".1!.$8$",)%-.)-%&"-!$("(!)$%*$+$"$,)$":$"8%$*$%&)",3",$"&!)(.(8$A$")1&)$".&A-%('$":$"*1'1,(%$"/("
:$.(",)%-.)-%&".128'$)3"!$.$,&%35"I(28'&"&:3-#&%$"&"-!$("!1("2$)1:$"4!)%-1"(!)$%*&+3"*&.$".&")1&)$
.'&,$'$".&%$"(28'$2$!)$&A3":$B&"&.$&"(!)$%*&+3",3"!-"2&(".128('$A$5"C&.3"!-",$"81)"1;,$%7&":(!",)&%)"
)1&)$"2$)1:$'$"!$.$,&%$"&)-!.("$7$!)-&'$'$"2$)1:$",-8'(2$!)&%$",$"81)"&:3-#&"8%(!"$=)(!:$%$&"
(!)$%*$+$(5"D'&,$'$".&%$"(28'$2$!)$&A3"7$.H$&"(!)$%*&+3"71%"*-!.+(1!&"4!".1!)(!-&%$9"$'$"8-)G!:"
21:(*(.&)$":-83"!$71($",3",$"&:&8)$A$"'&"!1-&"(!)$%*&+35
class ExternClass {
...
class InternClass {
...
}
...
}
J".'&,3"(2;%(.&)3",$".1281%)3".&"-!"2$2;%-"&'".'&,$("4!".&%$"&"*1,)":$*(!()39"8%(!"-%2&%$"&%$"&..$,"'&"
.$('&'+("2$2;%("&(".'&,$("$=)$%!$9".H(&%":&.3"&.$/)(&",-!)":$.'&%&+(".&"*((!:"8%(7&+(5"C&.3"1".'&,3"$=)$%!3"
81&)$"&7$&":1&%":1("81,(;('("21:(*(.&)1%(":$"&..$,"<8-;'(."/("8&.E&#$-8%(7&)$>9"1".'&,3"(!)$%!39".&"-!"
2$2;%-":$".'&,39"81&)$"&7$&"/("21:(*(.&)1%((":$"&..$,"8%(7&)$"/("8%1)$.)$:5" !"*-!.+($":$"8%$A$!+&"
modificatorului static, clasele imbricate pot fi de :1-3"*$'-%(K"clase imbricate statice /("clase interne.
13
Paradigme de Programare
Laboratorul 2
D'&,$'$"(2;%(.&)$"81)"*("-)('$":(!"2&("2-')$"8-!.)$":$"7$:$%$K"#%-8$&A3"'1#(."2&("2-')$".'&,$".&%$",-!)"
folosite într--!",(!#-%"'1.9"&B-)3"'&"4!.&8,-'&%$&"1;($.)$'1%"/("23%$/)$".'&%()&)$&".1:-'-(5
O c !"#$%&'(%)!*#$"*!*%)# $,)$":(!"8-!.)":$"7$:$%$".1281%)&2$!)&'"&,$23!3)1&%$".-"1".'&,3"$=)$%!39"
(2;%(.&%$&"$("*((!:".&-A&)3":1&%":$"21)(7$":$"#%-8&%$"&".1:-'-(5"L..$,-'"'&"1"&,)*$'":$".'&,3",$"*&.$"
prin folosirea numelui clasei externe:
O ) !"#$%+*,(+#$-+,"*!*%)#. $,)$"&,1.(&)3".-"1"(!,)&!+3"&".'&,$("$=)$%!$"/("&%$"&..$,":(%$.)"'&"2$2;%(("
8%(7&+("&("&.$'$("(!,)&!+$5"M((!:"&,1.(&)3".-"-!"1;($.)9"1".'&,3"(!)$%!3"!-"81&)$":$.'&%&"2$2;%(",)&)(.(5"
Pen)%-"&"(!,)&!+(&"1".'&,3"(!)$%!3"$,)$"2&("4!)G("!$71($":$"1"(!,)&!+3"&".'&,$("$=)$%!$K
D'&,$'$"(!)$%!$",-!)"-)('$"&)-!.(".G!:"$,)$"!$71($":$".'&,$"&B-)3)1&%$".$"81)"&,)*$'"&7$&"&..$,"'&"
2$2;%(("8%(7&+("&(".'&,$("$=)$%!$5"L.$,)$&",-!)"*1'1,()$"$=)$!,(7"4!",(,)$2-'":$"gestionare a
evenimentelor.
N=(,)3"O")(8-%(",8$.(&'$":$".'&,$"(!)$%!$K"locale <:$.'&%&)$"4!".1%8-'"-!$("2$)1:$>"/("anonime
<:$.'&%&)$"4!".1%8-'"-!$("2$)1:$"*3%3"&"'(",$":&"!-2$>5
P%23)1%-'")&;$'"8%$A(!)3")(8-%('$":$".'&,$"(2;%(.&)$"/(",.18-'"'1%5
2.1.10. Mo eniri
DG!:"1".'&,3"1,(%2,!3# (extinde>"1"&')3".'&,39"$&"21/)$!$/)$")1+("2$2;%(("&.$'$(".'&,$"<.G28-%(9"
2$)1:$"/(".'&,$"(2;%(.&)$>5"D1!,)%-.)1%(("!-",-!)"2$2;%(9":$.("!-",-!)"21/)$!(+(9":&%"81)"*("4!",.H(2;"
&8$'&+(":(!".1!,)%-.)1%((".'&,$(":$%(7&)$5"D'&,&".&%$":$%(7$&A3",$"!-2$/)$""4') !"#, cl!"#$1,(%2!*#,
) !"#$,5*%+"# sau ) !"#$6%45"D'&,&":(!".&%$",$":$%(7$&A3",$"!-2$/)$""47,() !"#, ) !"#$1,$'!3# sau
) !"#$7#(%+*,5"J%(.$".'&,3"&%$"$=&.)"1".'&,3":$";&A39".-"$=.$8+(&".'&,$("java.lang.Object5"C&.3"!-"$,)$"
,8$.(*(.&)3"1".'&,3":$";&A39"&)-!.(".'&,&"$=)(!:$"(28'(.()".'&,&"J;B$.)5"I$".%$$&A3"&,)*$'"1"($%&%H($":$"
.'&,$".-"%3:3.(!&"4!".'&,&"J;B$.)5"J".'&,3".&%$",$"&*'3"4!",-;&%;1%$'$"-!$(".'&,$",$"!-2$/)$") !"#$
1,"),+1,+*# :(!"&.$&".'&,35
Q$2;%(("8%(7&+("&(".'&,$(":$";&A3"!-"81)"&..$,&+(":(!".'&,&":$%(7&)3"<*&.$2"%$*$%(%$"&(.("/("'&"2$2;%(("
package-private atunci când clasa :$%(7&)3"!-",$"&*'3"4!"&.$'&/("8&.H$)>5"I3"!$"%$&2(!)(2".3"1".'&,3"
(2;%(.&)3"81&)$"&7$&"&..$,"'&")1+("2$2;%((".'&,$("$=)$%!$9"(!.'-,(7".$("8%(7&+("<.-"%$,)%(.+(('$"(28'(.&)$"
&)-!.(".G!:".'&,&"(2;%(.&)3"$,)$",)&)(.3>5"J"&,)*$'":$".'&,39":&.3"81&)$"*("21/)$!()3":$"1".'&,3":$%(7&)3"
<,$"&8'(.3"&.$'$&/("%$#-'(":$"21/)$!(%$>"&%$":$"&,$2$!$&"&..$,"'&"2$2;%(("8%(7&+("&(".'&,$(":$";&A35
14
Paradigme de Programare
Laboratorul 2
1) /-*&$%+($')01!"2(+#-(
DG28-%('$"21/)$!()$"81)"*("*1'1,()$":(%$.)9".&"/(".-2"&%"*("*1,)":$.'&%&)$"4!"&.$&".'&,35
2) /-*&$%+($')!$&-3$#-(
Q$)1:$'$"21/)$!()$"81)"*("&..$,&)$":(%$.)9".&"/(".-2"&%"*("*1,)":$.'&%&)$"4!"&.$&".'&,35
I$"81)":$.'&%&"2$)1:$":$"(!,)&!+3".-"&.$'$&/(",(#!&)-%(".&".$'$":(!".'&,&":$";&A39".&%$"71%"*("&,)*$'"
suprascrise5"@$!)%-"&",-8%&,.%($"1"2$)1:3":(!".'&,&":$";&A3")%$;-($"83,)%&)"/(")(8-'"%$)-%!&)5"I$"81&)$"
.&")(8-'"%$)-%!&)":$"!1-&"2$)1:3",3"*($"-!",-;)(8"&'".$'-("%$)-%!&)":$"2$)1:&",-8%&,.%(,3"<covariant
return type>5"@$!)%-"&"&..$,&"2$)1:$'$":$"(!,)&!+3",-8%&,.%(,$":(!".'&,&":$";&A3",$"81&)$"*1'1,("
calificarea cu cuvântul cheie super.
I$"81)":$.'&%&"2$)1:$":$".'&,3".-"&.$'$&/(",(#!&)-%(".&".$'$":(!".'&,&":$";&A39"&.$,)$&"*((!:"ascunse.
Pentru a suprascr($"1"2$)1:3":$".'&,3":(!".'&,&":$";&A3")%$;-($"%$)-%!"&.$'&/(")(8".&"4!"2$)1:&":$";&A3"
sau un subtip al acestuia.
Metodele suprascrise nu pot avea modificatori de acces mai restrictivi decât modificatorii metodelor
:(!".'&,$'$":$";&A35"Q$)1:$'$",)&)(.$"!-"81)"*(",-8%&,.%(,$":$"2$)1:$":$"(!,)&!+39"(&%"2$)1:$'$":$"
(!,)&!+3"!-"81)"*(",-8%&,.%(,$":$"2$)1:$":$".'&,35
@$"'G!#3".$'$"21/)$!()$9",$"81)":$.'&%&"/("2$)1:$"!1(5"L.$,)$"2$)1:$"!1("81)",-8%&4!.3%.&"'&"!$71($"
2$)1:$"21/)$!()$":(!".'&,&":$";&A39"*3%3"&",$",uprascrie sau ascunde.
3) Clasa Object
D'&,&"J;B$.)",$"&*'3"4!"7G%*-'"($%&%H($(":$".'&,$"(&%"1%(.$"&')3".'&,3"$,)$":$,.$!:$!)3":(%$.)3",&-"
(!:(%$.)3"&".'&,$("J;B$.)"/("21/)$!$/)$"2$)1:$'$",&'$":$"(!,)&!+35
L.$,)$"2$)1:$"&B-)3"'&",(!.%1!(A3%('$"*(%$'1%":$"$=$.-+($"/("!-"81)"*(",-8%&,.%(,$5"D$'$'&')$"2$)1:$"81)"
*(",-8%&,.%(,$"<$=.$8)G!:"#$)D'&,,>"/("-!$1%(".H(&%"$,)$"!$.$,&%"8$!)%-"&"'$"&:&8)&"'&",8$.(*(.-'-("
claselor create.
15
Paradigme de Programare
Laboratorul 2
D%$$&A3"/("%$)-%!$&A3"1".18($"&"1;($.)-'-(".-%$!)5" !"(28'$2$!)&%$&":(!".'&,&"J;B$.)9"4!"2$)1:&"
.'1!$<>",$"7$%(*(.3"2&("4!)G(":&.3".'&,3":(!".&%$"&"*1,)"(!,)&!+(&)"1;($.)-'"(28'$2$!)$&A3"(!)$%*&+&"
Cloneable5"C&.3"!-9",$"&%-!.3"1"$=.$8+($"CloneNotSupportedException5"C&.3":&9",$".%$$&A3"-!"
1;($.)":$"&.$'&/(")(8"/(",$"(!(+(&'(A$&A3".G28-%('$"&.$,)-(&".-"7&'1%('$".G28-%('1%":(!"1;($.)-'".-%$!)5"
D$'"2&(",(28'-"21:":$"&"*&.$"1;($.)$'$"-!$(".'&,$".'1!&;('$"$,)$",3"*&.$2".'&,&",3"(28'$2$!)$A$"
(!)$%*&+&"D'1!&;'$5
Im8'$2$!)&%$&"(28'(.()3":(!".'&,&"J;B$.)"$,)$":$"1;(.$(",-*(.($!)39"2&("8-+(!"&)-!.(".G!:".'&,&":$.'&%3"
%$*$%(!+$"'&"1;($.)$"$=)$%!$5"C&.3",$":1%$/)$".&"1;($.)$'$".'1!$",3"&(;3"%$*$%(!+$"'&".18(("8%18%(("&'$"
&.$,)1%"1;($.)$"$=)$%!$9"&)-!.(")%$;-($",3",$",-8%ascrie metoda clone. Prin clonarea obiectelor referite
,$"1;+(!$"(!:$8$!:$!+&"4!)%$"1;($.)-'"1%(#(!&'"/(".'1!&",&5"R&",-8%&,.%($%$&"2$)1:$(".'1!$")%$;-($"&7-)"
#%(B3".&"21:(*(.&)1%-'":$"&..$,",3"!-"*($"2&("%$,)%(.)(7":$.G)".$'":(!".'&,&":$";&A35"C&.3",$"21/)$!$/)$"
direct din clasa Object, atunci acesta poate fi protected sau public.
S$)-%!$&A3".1:-'"H&,H"&'"1;($.)-'-(".-%$!)9".&%$"$,)$"&:%$,&":$"2$21%($"4!"H$=&A$.(2&'5"@%(!"
:$*(!(+($9":&.3":1-3",-!)".1!,(:$%&)$"$#&'$9"&)-!.(".1:-%('$"'1%"H&,H")%$;-($"1;'(#&)1%(-",3"*($"$#&'$5
?!:(.3":&.3":1-3"1;($.)$",-!)".1!,(:$%&)$"$#&'$5"?28'$2$!)&%$&":(!".'&,&"J;B$.)".128&%3"%$*$%(!+$'$"
.$'1%":1-3"1;($.)$9"&:(.3":&.3".$'$":1-3"%$*$%(!+$".128&%&)$"%$*$%3"&.$$&/("(!,)&!+3":$"1;($.)5"C1-3"
1;($.)$"81)"*(".1!,(:$%&)$"$#&'$"8%(!"$.H(7&'$!+&"(!*1%2&+(('1%"8$".&%$"'$":$+(!9".H(&%":&.3",-!)":1-3"
(!,)&!+$":(*$%()$9".&A"4!".&%$"(28'$2$!)&%$&"(28'(.()3":(!"J;B$.)"!-"2&("$,)$":$"&B-)1%5
!"&,)*$'":$".&A-%("4!".&%$"$.H(7&'$!+& &":1-3"1;($.)$"!-".1(!.(:$".-"$#&'()&)$&"%$*$%(!+$'1%9".'&,&"
)%$;-($",3",-8%&,.%($"2$)1:&"$T-&',5" !)1):$&-!&".G!:"2$)1:&"$T-&',"$,)$",-8%&,.%(,39"2$)1:&"
H&,HD1:$")%$;-($",-8%&,.%(,3":$"&,$2$!$&"<&",$"%$7$:$&":$*(!(+(&K":1-3"1;($.)$",-!)"$#&'$9"&)-!.("
cod-%('$"'1%"H&,H")%$;-($",3"*($"$#&'$>5
S$)-%!$&A3"1"%$8%$A$!)&%$"4!"*1%2&)")$=)"&"1;($.)-'-(5"N,)$"%$.12&!:&)3",-8%&,.%($%$&"&.$,)$("2$)1:$"
în toate clasele.
16
Paradigme de Programare
Laboratorul 2
4) 4#'.$)*+)!$&-3$),+%'#$
Declararea unor metode ca fiind finale (modificatorul final>"428($:(.3".'&,$":$%(7&)$",3",-8%&,.%($"
&.$'$"2$)1:$5"I&"1;,$%7&)".3"/("4!".'&,&"J;B$.)",-!)"1",$%($":$"2$)1:$"*(!&'$. De obicei metodele
&8$'&)$":(!".1!,)%-.)1%(",&-":(!";'1.-%('$":$"(!(+(&'(A&%$",$":$.'&%3"*(!&'$5"C&.3"1"2$)1:3"$,)$"
,-8%&,.%(,3"(&%".1!,)%-.)1%-'"1"&8$'$&A3"81)"&83%$&"%$A-')&)$"(28%$7(A(;('$"/("!$:1%()$5 J"4!)%$".'&,3"
81&)$"*(":$.'&%&)3"*(!&'39"428($dicând astfel orice încercare de extindere a sa.
5) 4#'.$)*+)!$&-3$)'5.&('0&$
J".'&,3":$.'&%&)3".-"21:(*(.&)1%-'"abstract ,$"!-2$/)$") !"#$!'"*(!)*#5"N&"!-"81&)$"*("(!,)&!+(&)3":&%"
81&)$"*("$=)(!,35"J"2$)1:3":$.'&%&)3".-"&.$,)"21:(*(.&)1%",$"!-2$/)$"&,*01#$!'"*(!)*#5"J"2$)1:3"
&;,)%&.)3"!-"&%$".1%8"(&%":$.'&%&+(&"$,)$"-%2&)3":$"WXW"<(:$!)(.".&"'&"(!)$%*$+$>5"J".'&,3"&;,)%&.)3"81&)$"
.1!+(!$"2$)1:$"&;,)%&.)$9":&%"!-"$,)$"1;'(#&)1%(-9"4!",.H(2;"1".'&,3".&%$".1!+(!$"1"2$)1:3"&;,)%&.)3"
)%$;-($":$.'&%&)3"1;'(#&)1%(-".&"*((!:"&;,)%&.)35
DG!:"1".'&,3"$=)(!:$"1".'&,3"&;,)%&.)3")%$;-($",3"(28'$2$!)$A$")1&)$"2$)1:$'$",&'$"&;,)%&.)$"<:&.3"!-9"
)%$;-($":$.'&%&)3":$"&,$2$!$&"&;,)%&.)3>5" !"21:"&,$23!3)1%9"1".'&,3".&%$"(28'$2$!)$&A3"1"(!)$%*&+3"
*3%3",3-i implementeze toate meto:$'$")%$;-($":$.'&%&)3".&"*((!:"&;,)%&.)35
J".'&,3"&;,)%&.)3"81&)$"&7$&".G28-%("/("2$)1:$",)&)(.$9"(&%"&.$,)$&"81)"*("&..$,&)$"!-2&("8%(!".&'(*(.&%$"
cu numele clasei.
6) Convertiri
J;($.)$'$"(!,)&!+(&)$":(!)%-1"&!-2()3".'&,3"81)"*("*1'1,()$"/("4!"'1.&+(("-!:$",-!)"&/)$8)&)$"(!,)&!+$"ale
-!1%".'&,$":(!".&%$".'&,&"%$,8$.)(73":$,.(!:$5
D1!7$%)(%$&".&%$"&%$"'1."'&"1"&,)*$'":$"&)%(;-(%$"$,)$"1".1!7$%)(%$"(28'(.()3"<implicit casting).
!")(28-'"$=$.-+($(",$"7$%(*(.3":&.3")(8-'"1;($.)-'-("%$*$%()":$"1;B"81&)$"*(".1!7$%)()"'&")(8-'".$%-)5"C&.3"
!-"1"$=.$8+($"7&"*("&%-!.&)35"@$!)%-"&"$7()&"&,)*$'":$"$=.$8+((",$"81&)$"*1'1,("18$%&)1%-'"instanceof
8$!)%-"&"7$:$&":&.3"-!"1;($.)"81&)$"*(".1!7$%tit la un anumit tip.
2.1.11. Enumer!ri
P!")(8"$!-2$%&%$"$,)$"-!")(8"&'$".3%-(".G28-%(".1!,)&-"4!)%-un set fix de constante (fiind constante,
!-2$'$".G28-%('1%",$",.%(-"8%(!".1!7$!+($".-"'()$%$"2&%(>5"@$!)%-":$*(!(%$&"-!-(")(8"$!-2$%&%$",$"
*1'1,$/)$".-7G!)-'".H$($"enum.
17
Paradigme de Programare
Laboratorul 2
J":$.'&%&+($"$!-2":$*(!$/)$":$"*&8)"1".'&,35"L.$&,)&"$=)(!:$"(28'(.()"B&7&5'&!#5N!-2"/("8%(!"-%2&%$"!-"
2&("81&)$"$=)(!:$"&').$7&5"D1%8-'"-!$(".'&,$"$!-2"81&)$"(!.'-:$":$"&,$2$!$&"2$)1:$"/("&')$".G28-%(5"
P!$'$",-!)"&:3-#&)$"(28'(.() :$".3)%$".128('&)1%5
De exemplu, tipul enum are o &,*01#$"*!*%)#$2! 4,", care întoarce un array cu toate valorile, în
ordinea în care au fost declarate.
L)-!.(".G!:":$*(!(2".G28-%("/("2$)1:$"4!")(8-%('$"$!-29".1!,)&!)$'$"$!-2$%3%((")%$;-($",3"*($"8%(2$'$"
(!,)%-.+(-!("/(")%$;-($")$%2(!&)$".-"WXW5
2.1.12. "#$%&!'(
L:!1)3%('$"<annotations>"1*$%3":&)$":$,8%$"-!"8%1#%&29":&)$".&%$"!-"*&."8&%)$":(!"8%1#%&2-'"4!",(!$"/("
!(.("!-"&-"-!"$*$.)":(%$.)"&,-8%&".1:-'-("8$".&%$"4'"&:!1)$&A35 L:!1)3%('$"81)"1*$%("(!*1%2&+(("'&"
.128('&%$9"4!")(28-'"%-'3%((",&-"81)"*("*1'1,()$"4!")(8-'":(,)%(;-(%((5"L:!1)3%('$"81)"*("&8'(.&)$"
:$.'&%&+(('1%":$".'&,$9".G28-%(9"2$)1:$"/("&')$"$'$2$!)$":$"8%1#%&25
L:!1)3%('$"&8&%"4!&(!)$&":$.'&%&+($(9":$"%$#-'&"8$"1"'(!($"8%18%($"/("81)".1!+(!$"elemente .-",&-"*3%3"
nume.
@Author (
name = ”...”,
date = ”...”
)
class Aclass { .. }
C&.3"$=(,)3"-!",(!#-%"$'$2$!)"&)-!.("!-2$'$"'-("81&)$"*("12(,9"(&%":&.3"!-"$=(,)3"!(.("-!"$'$2$!)"81)"*("
12(,$"/("8&%&!)$A$'$5
1) Documentarea codului
L:!1)3%('$"81)"*("*1'1,()$"8$!)%-"#$!$%&%$&"&-)12&)3"&":1.-2$!)&+($(".1:-'-(5"Q&("4!)G(",$":$*(!$/)$"-!"
tip de adnotare (annotation type>5"I$"*1'1,$/)$".uvântul cheie interface precedat de @ (at =
Annotation Type).
18
Paradigme de Programare
Laboratorul 2
@interface ClassDoc {
String author();
String date();
int version default 1;
}
D1%8-'":$*(!(+($(".-8%(!:$":$.'&%&+((":$"$'$2$!)$9".&%$",$&23!3".-"!(/)$"2$)1:$"/("81)"&7$&"18+(1!&'"
7&'1%("(28'(.()$5"J:&)3":$*(!()")(8-'"&:!1)3%((9"&.$,)&"81&)$"*("*1'1,()"<.-".G28-%('$".128'$)&)$>"'&"
&:!1)&%$&"$*$.)(73"&"-!$(".'&,$5
@ClassDoc (
author = ”...”,
date = ”...”,
version = 3
)
public class Aclass { ... }
@$!)%-".&"(!*1%2&+(('$":(!"&:!1)&%$",3"&8&%$"4!":1.-2$!)&+(&"#$!$%&)3":$"Javadoc9"4!,3/(":$*(!(+(&"
&:!1)3%((")%$;-($"&:!1)&)3K
import java.lang.annotation.*;
@Documented
@interface ClassDoc(
...
)
2) 63%-&7(+),-#-.+&$)3$)0-!"+#'&-(
N=(,)3"Y")(8-%(":$"&:!1)3%("8%$:$*(!()$"4!",8$.(*(.&+(('$"'(2;&B-'-(5
@DeprecatedK"(!:(.3"*&8)-'".3"$'$2$!)-'"%$,8$.)(7"$,)$"0:$8%$.&)$:0"/("!-"&%"2&(")%$;-("*1'1,()5" !"
&.$,)",$!,".128('&)1%-'"#$!$%$&A3"-!"2$,&B":$"&7$%)(A&%$"&)-!.(".G!:"$'$2$!)-'"$,)$"*1'1,()5"L.$&,)3"
&7$%)(A&%$")%$;-($"2$!+(1!&)3"/("4!"comentariile pentru Javadoc printr--!")&#"&,$23!3)1%5
/**
* @Deprecated
* text explicativ
*/
@Deprecated
void aMethod() { ... }
@OverrideK"(!:(.3"*&8)-'".3",$"(!)$!+(1!$&A3".&"2$)1:&"&:!1)&)3",3",-8%&,.%($"1"2$)1:3":(!".'&,&":$"
;&A35"DG!:",$":1%$/)$",-8%&,.%($%$&"-!$("2$)1:$":(!".'&,&":$";&A3"!-"$,)$"1;'(#&)1%($"*1'1,(%$&"&.$,)$("
&:!1)3%(":&%"&.$&,)&"81&)$"*(":$"*1'1,5"C&.3"2$)1:&"!-",-8%&,.%($".-",-..$,"2$)1:&".1%$,8-!A3)1&%$"
:(!".'&,&":$";&A3"&)-!.(".128('&)1%-'"7&"#$!$%&"1"$%1&%$9"'-.%-".&%$"!-",-ar *("4!)G28'&)"*3%3"&:!1)&%$9"
:$1&%$.$".128('&)1%-'"!-"81&)$"/)(":&.3",$":1%$/)$"1",-8%&,.%($%$",&-":$.'&%&%$&"-!$("&')$"2$)1:$5
@SuppressWarningsK"(!:(.3".128('&)1%-'-(",3"%$!-!+$"'&"#$!$%&%$&"-!1%"2$,&B$":$"&7$%)(A&%$"4!"
.'&,&",&-"2$)1:&"&:!1)&)35
@SuppressWarnings(”deprecation”)
void method() { .. }
C&.3",$":1%$/)$",-8%(2&%$&"&"2&("2-')1%".&)$#1%((":$"2$,&B$":$"&7$%)(A&%$",$"*1'1,$/)$"-%23)1&%$&"
,(!)&=3K
@SuppressWarnings({”deprecation”, ”unchecked”})
19
Paradigme de Programare
Laboratorul 2
2.2. UML
2.2.1. Introducere în UML
UML (Unified Modeling Language) este un limbaj de modelare standardizat folosit pentru a specifica,
7(A-&'(A&9"21:(*(.&9".1!,)%-("/(":1.-2$!)&"-!",(,)$2",1*)Z&%$"1%($!)&)-obiect în curs de dezvoltare.
Diagrame structurale:
o Diagrama de clase;
o Diagrama de componente;
o Diagrama de deployment;
o Diagrama de obiecte;
o Diagrama de pachete;
Diagrame comportamentale:
o !"#$"%"&'(&")*!+!*,-!;
o Diagrama de stare;
o Diagrama „use-case”;
!"#$"%(&'(&!.*($")-!/.(0
o Diagrama de colaborare;
o !"#$"%"&'(&1()+(.-,2
Figura 1- !"#$"%&'()'*)+,)-.&
20
Paradigme de Programare
Laboratorul 2
Figura 2 - !"#$"%&'()'+/0"1/$"$)
1) Clasa
Clasa dintr-o '!"#$"%&'(&)3"1(&(1*(&$(8$(9(.*"*,&8$!.*$-6&),1/-,&:%8,$-!*,&:.&*$(!&1()-!/.!0&)("&
1/8($!6"$,&)6.-!.(&./%(3(&)3"1(!4&)("&%('!".,&)6.-!.(&"*$!5/*(3(&)3"1(!4&!"$&)("&!.;($!6"$,&68($"-!!3(2
</%(=)3"1,
Atribute
>8($"-!!
Atributele 7!&68($"-!!3(&1*"*!)(&1/.*&1/53!.!"*(2
7!8!1!0!9"9)"'"9$!139)0/$':!'/6)$".!!0/$:
+ - 8/53!)&@86"*(&1"&3!81("1),&1!%563/3&ABC
- - private;
# - protected;
~ - package.
2) Asocierea
D16)!($("&$(8$(9!.*,&$(3"-!"&'!.*$(&'6/,&)6.)(8*( 7!&"$(&"16)!"*,&/.&6$'!.&'(&%/3*!83!)"$(&
(cardinalitate). E"$'!."3!*"*("&86"*(&;!&/.&./%,$&@FB4&/.&!.*($+"3&@G4H4FB&1"/&6&%/3-!%(&@I22FB2& (&
"1(%(.("4&(?!1*,&1!%563/3&* )"$(&$(8$(9!.*,&!.*($+"3/3&J&22&!.;!.!*2&D)(1*&1!%563&86"*(&;!&;6361!*&7!&:.*$-
/.&!.*($+"3&I22K4&"+L.'&1(%.!;!)"-!"&M/./3&1"/&%"!&%/3*(N2
D16)!($("&5!'!$()-!6."3,&1(&$(8$(9!.*,&8$!.*$-6&3!.!(&)6.*!./,4&!"$&)("&/.!'!$()-!6."3,&8$!.*$-o linie
)6.*!./,&"+L.' 3"&/.&)"8,*&6&1,#("*,&)(&1(%.!;!),&'!$()-!"&'(&"16)!($(2
21
Paradigme de Programare
Laboratorul 2
Figura 3 – Asocierea
3) Agregarea !"#$%&'()*)+
Agre#"$("&7!&)6%8/.($("&$(8$(9!.*,&&$(3"-!! în care un element poate fi compus din alte elemente.
!;($(.-"&)6.1*,&:.&;"8*/3&),&3"&)6%8/.($(&$(3"-!"&(1*(&%"!&8/*($.!),&:.&1(.1/3&),&:.*$(#/3&./&86"*(&
(?!1*"&;,$,&8,$-!2&D#$(#"$("&1(&$(8$(9!.*,&8$!.*$-6&3!.!(&)6.*!./,&)"$( "$(&3"&/.&)"8,*&/.&$6%5ɺ&iar la
compunere rombul este plin.
Figura 4 - Compunere"':!'"#$)#"$)"
4) ,)&)(-)(.+ !"/)()*+0!1+*)+
(8(.'(.-"&18()!;!),&;"8*/3&),&/.&(3(%(.*&'(8!.'(&'(&"3*/3 7!&1(&$(8$(9!.*,&8$!.*$-6&3!.!(&8/.)*"*,&)/&6&
1,#("*,2
O(.($"3!9"$("&1"/&%67*(.!$("&:.)"81/3("9,&"*$!5/*(3(&7!&68($"-!!3(&)6%/.(&%"!&%/3*6$&)3"1(&:.*$-o
1!.#/$,&)3"1,4&)(3(3"3*(&'($!+L.'/-se din aceasta. O(.($"3!9"$("&1(&$(8$(9!.*,&8$!.*$-o linie care are la
/.&)"8,*&6&1,#("*,&@1/5&;6$%,&'(&*$!/.#P!B2
Q.&)6.*!./"$(&(1*(&8$(9(.*"*,&6&'!"#$"%,&RST&'(&)3"1(&:.&$(8$(9(.*"$("&)3"1!),&@Figura 5 - !"#$"%,&
UML de claseB&7!&:.&$(8$(9(.*"$("&U)3!81(&@Figura 6 - !"#$"%,&RST&'(&)3"1().
22
Paradigme de Programare
Laboratorul 2
Figura 5 - !"#$"%&';<='()'+0"*)
23
Paradigme de Programare
Laboratorul 2
Figura 6 - !"#$"%&';<='()'+0"*)
24
Paradigme de Programare
Laboratorul 2
2.3. Tema
V("3!9"-!&6&"83!)"-!(&)"$(&+"&#(1*!6."&6&3!1*,&'(&8/53!)"-!!&@),$-!&7!&$(+!1*(B 7!&+"&permite introducerea,
7*($#($("&7!&";!7"$("&36$2&W(.*$/&!%83(%(.*"$(&1(&+"&;6361!&'!"#$"%"&'(&)3"1(&din Figura 6 - !"#$"%,&
UML de clase. La rularea programului se va ";!7"&3"&)6.163,&/.&%(.!/&)"$( va permite ad,ugarea,
7*($#($(", afi7"$("&8/53!)"-!!36$ 7!&!(7!$("&'!.&8$6#$"%2&X.;6$%"-!!3(&'(18$(&),$-!&7!&$(+!1*(&1(&+6$&)!*!&'(&
3"&*"1*"*/$,2
25
Paradigme de Programare
Laboratorul 1
Paradigme de Programare
Laboratorul 1
1.1. !"#$%&'#()(*$+#(&+¶digmelor de programare
O !"!#$%&' permite specificarea unui model de rezolvare a unei probleme.
!"#$%&'$'!()*')"+!'#",-&+.##/"+!'-*#"&#$0)1+&"2'"%*-3*)$)*'"4-&-,#("-4'*5")6'&')7#"$'6)!#,$'"6)"7#"
paradigma 4-&-,#(58" !(*--"),(4'&"2'",#(+).#'"#$%&'$'!()*')"$'(-2'#",#"9'*#4#6)*')",-&+.#'#",'"4)6'"
,#$%&+8":'"%-)('",%+!'"65"%)*)2#3$)"2'"%*-3*)$)*'"4-&-,#(5"',('"-"6&),5"2'"&#$0)1'8" !")6',(",'!,"
%+('$",%+!'"65"&#$0)1+&";"#!6&+2'"6)*)6('*#,(#6#")&'"%)*)2#3$'&-*"#$%'*)(#95"7#"%*-6'2+*)&5/"#)*"&)"
)6',(')"&#$0)1+&";<<")2)+35"7#"6)*)6('*#,(#6#")&'"%)*)2#3$'#"2'"-*#'!()*'"%'"-0#'6('8
1.1.1. ,+#+-./0+&.0'(#+$.1%&
,'"6)*)6('*#=')=5"%*#!(*-un model abstract al unui calculator cu o memorie foarte mare,
modelul clasic von Neumann. :-&+.##&'",'"35,',6"%*#!"%*'&+6*5*#"6)*'"6+%*#!2"),#3!5*#/"6#(#*#/"
-%'*).##")*#($'(#6'",#"&-3#6'/",'&'6.##"%'!(*+"6-!(*-&+&"4&+>+&+#"'>'6+.#'#8"?#!")6'),(5"6&),5"2'"
limbaje fac parte cele de asamblare sau BASIC.
1.1.2. ,+#+-./0+&'#2!(-"#+3%&
extinde paradigma a!('*#-)*5"6+"+!"$'6)!#,$"2'")0,(*)6(#=)*'/"6'&")&"%*-6'2+*#&-*"6+"
%)*)$'(*#8"@&('"4)6#&#(5.#",+!("#('*).#)/"*'6+*,#9#()(')/",'&'6.#)8"?#!")6'),(5"6&),5"4)6"%)*('"
&#$0)1'&'"ABCDC@E/"F),6)&/";8" !")6'),(5"%)*)2#3$5/"+!",#,('$",'"$-2'&')=5"6)"+!",'("2'"
algori($#"G%*-6'2+*#H"7#"+!+&"2'"2)('8"?'7#"$'6)!#,$+&"2'")0,(*)6(#=)*'"-4'*#("2'")6'),(5"
%)*)2#3$5/"%*-6'2+*#&'/"*'%*'=#!(5"+!"$'6)!#,$"%+('*!#6/"2'=)9)!()1+&"',('"6'&")&",&)0'#"
&'35(+*#"2#!(*'"%*-6'2+*5",#"2)('&'"$)!#%+&)('8"
„?)65"%*-6'2+*#&'"7#"4+!6.##&'",+!("9'*0'/"#)*"0&-6+*#&'"2'"2)('",+!(",+0,()!(#9'/"+!"%*-3*)$"
procedural este organizat în jurul verbelor, în timp ce un program orientat pe obiecte este
organizat în jurul substantivelor”.
()*$+$,$! 2)(5"2'"J--6K"F*-3*)$5*##"-*#'!()('"%'"-0#'6('L"
„FBB"',('"$'(-2)"2'"#$%&'$'!()*'"M!"6)*'"%*-3*)$'&'",+!("-*3)!#=)('"6)"7#"6-&'6.##"2'"
-0#'6('"6'"6--%'*')=5"M!(*'"'&'/"4#'6)*'"-0#'6("*'%*'='!(N!2"#!,()!.)"+!'#"6&),'O"4#'6)*'"6&),5"
)%)*.#!'"+!'#"#'*)*K##"2'"6&),'/"6&),'&'"4##!2"+!#('"%*#!"*'&).##"2'"$-7('!#*'”.
ÎncapsulareaL"$'6)!#,$+&"6)*'"&')35"2)('&'"2'"-%'*)(-*##"),+%*)"&-*/"$'6)!#,$+&"%*#!"6)*'",'"
permite crearea unui obiect; un obiect fiind -"#!,()!.#'*'")"+!+#"(#%"
1
Paradigme de Programare
Laboratorul 1
-./0)+$")!: mecanismul care permite crearea de noi tipuri de obiecte din cele existente; noile
(#%+*#"%*'#)+/"$-7('!',6"$'(-2'"7#"2)('"2'"&)"(#%+&"%5*#!('/"%+(N!2",5"$-2#4#6'",)+",5")2)+3'"
altele. Acest mecanism face posibil ca u!"-0#'6(",5"4#'"+!"'>'$%&)*",%'6#4#6")&"+!+#"(#%"$)#"
general
PolimorfismulL"$'6)!#,$+&"6)*'"%'*$#('"+!'#"#!('*4'.'",5"4#'"4-&-,#('"6+"-"6&),5"3'!'*)&5"2'"
)6.#+!#L"-0#'6('"2'"(#%+*#"2#4'*#('",5"'>'6+('")6'')7#"-%'*).#'8"
@7)2)*/"%)*)2#3$)"FBB"4-&-,'7('"$)# $+&('"('K!#6#"2#!"%)*)2#3$'&'")!('*#-)*'L"$-7('!#*')/"
$-2+&)*#=)*')/"%-&#$-*4#,$+&/"M!6)%,+&)*')8"P2'')"%*-3*)$5*##"-*#'!()('"%'"-0#'6('",-)"!5,6+("M!")!##"
Q RS/"4##!2"%+,5"M!"%*)6(#65"%*#!"#!('*$'2#+&"&#$0)1'&-*"Simula 67 7#"$)#"(N*=#+"%*#!"Smalltalk (1975).
;+"(-)('")6',(')"%)*)2#3$)")"4-,("4-&-,#(5"%'",6)*5"&)*35"M!"6*')*')")%).##&-*")0#)"2#!")!##"Q 90.
@,(5=#/"$+&('"&#$0)1'"2'"%*-3*)$)*'"-4'*5",+%-*("$)#"$+&(",)+"$)#"%+.#!")9)!,)("%'!(*+"4)6#&#(5.#&'"
POO (C++, Java, JavaScript, .NET(C#, VB.NET), FK%/"C+0T"7#")&('&'H8
1.2. 4(&3+&5&3+&566&7.&,88
U#$0)1+&";<<")"4-,("#!#.#)&"6*')("2'"J1)*!'":(*-+,(*+%"6)"+!"better C. C++ a fost o încercare de a
'>(#!2'"7#"2'")",6K#$0)"&#$0)1+&"2'"%*-3*)$)*'";"%'!(*+")"*'=-&9)"-"%)*('"2#!"%*-0&'$'"&#$0)1+&+#"
#!#.#)&8"E-+&"&#$0)1")"4-,("%*#$)"-)*5",()!2)*2#=)("#!"VWWX"7#"%-)('"4#"6-!,#2'*)("),(4'&"+!"&#$0)1"$+&("
mai nou decât C.
?',%*'"2#4'*'!.'&'"2#!(*'"6'&'"2-+5"9'*,#+!#"2'"&#$0)1")+")%5*+("(-("4'&+&"2'"2#,6+.##"M!(*'")2'%.##"2'"-"
%)*('"7#"2'"6')&)&(5/"2)*"+!'&'"%5*'*#"2',%*'";<<",)+"4-*$)("3*'7#(L
;<<"!+"',('"$)#"&'!("2'6N(";8"Y)1-*#()(')"%*-3*)$'&-*";",+!("%*-3*)$'";<<"9)'"7#")*"
(*'0+#",5")#05")6'&')7#"%'*4-*$)!.'"#!2#4'*'!("2)65"',('"4-&-,#("6-$%#&)(-*+&";",)+"
compilatorul C++.
A)6#&#(5.#&'",%'6#4#6'";<<"!+"2)+",+%*)M!65*6)*'8"@6',('",+%*)M!65*65*#",+!("6-$%)*)0#&'"6+"
,+%*)M!65*65*#&'"6)*'")*"4#"#!(*-2+,'"2'"%*-3*)$)(-*"2+%5"M!6'*65*#&'"2'")"#$%&'$'!()"4)6#&#(5.#"
similare în C.
;<<"!+"',('"-*#'!()("-0#'6(8";<<"6-!.#!'"-",'*#'"2'"'>('!,##"%',('"&#$0)1+&";"6)*'"4)6"
pro3*)$)*')"-*#'!()(5"%'"-0#'6("7#"%*-3*)$)*')"3'!'*#65"$)#"4)6#&58";<<"!+"4-*.')=5"M!,5"
%*-3*)$)(-*+&",5"4-&-,'),65"%)*)2#3$)"BB8"
struct element_t {
struct element_t *next, *prev;
void *element;
};
6-2+&"'6K#9)&'!("#!";<<")*)(5"),(4'&L
2
Paradigme de Programare
Laboratorul 1
P$%&'$'!()*')";<<"%'*$#('")(N("'9#()*')"'*-*#&-*"2'"%*-3*)$)*'"6N("7#"-"$)#"0+!5"-%(#$#=)*'"2' 65(*'"
compilator.
1.3. 9'3.!+:.(
U)0-*)(-*+&"6-!,(5"M!"*')&#=)*')"+!'#"$#6#")%).##";@?/"&#$0)1+&"4-&-,#("4##!2";<<8":6-%+&")6',(-*"
)%).##"!+"',('"M!,+7#*')")!+$#(-*"'&'$'!('"2#!"6'&'"2-+5"&#$0)1'"6#"%+!'*')"M!"'9#2'!.5")"
avantajelor folosirii principiilo*"%*-3*)$5*##"-*#'!()('"%'"-0#'6(8
@%).#)"#!('*%*'(')=5"-",'*#'"2'"6-$'!=#",#$%&'"%*#!"6)*'",'"6'*'"2','!)*')"+!-*"4#3+*#"3'-$'(*#6'8"
F*#!"#$%&'$'!()*')"M!"6-2")")6',(-*"4#3+*#"3'-$'(*#6'",'"%-("%+!'"M!"'9#2'!.5"%*#!6#%##&'"FBB/"%*#!"
urmare nu se va ins#,()"%'"#!('*4).5",)+"%'"#!('*%*'(-*+&"2'"6-$'!=#8
?#!")6'&')7#"$-(#9'"2'",#$%#6)*'")")%).#'#",'"9)"4-&-,#"6)"$'2#+"2'"2'=9-&()*'"9'6K#+&"J-*&)!2
;<<",#"�*5*#)"3*)4#65"J[P8"F'!(*+")"!+")9')"%*-0&'$'"2'"%'*4-*$)!.5")"*+&5*##")6',(+#"$'2#+"?B:"
,+0",#,('$+&"2'"-%'*)*'"\#!2-],/",'"4-&-,'7('"+!"'$+&)(-*"%'!(*+")%).##"?B:L"DOSBox. Acesta
'$+&')=5"+!",#,('$"2'"-%'*)*'"?B:8"^&"%-)('"4#"35,#("&)"&#!I-ul anterior si de asemenea este instalat în
laboratoare împreuna cu mediul BorlandC++.
1.3.1. 5(#.*:(3(&+'3.!+:.(.
F'!(*+")"!+"#!(*)"M!"2'()&##"2',%*'"&#$0)1/",(*+6(+*)"2'"0)=5")%).#'#"9)"',('"-4'*#(58
@%).#)"-4'*5"-"6-!,-&5",#$%&5"%*#!"6)*'",'"#!(*-2+6"2#9'*,'"6-$'!=#L
clear:7('*3'*'")"'6*)!+&+#"
exit:#'7#*'"2#!")%).#'"
help <nume>:%*'=#!(5",#!()>)"7#"%)*)$'(*##"+!'#")!+$#('"6-$'!=#"G'>L"(int x1, int y1, int x2,
int y2))
12.&!+#'34comanda propriu-=#,5"G'>L"line(100, 100, 300, 300))
1.3.2. Implementare
:'"4-&-,'7('"6&),)"2'"0)=5"Form/"2#!"6)*'"2#9'*,'&'"4-*$'"3'-$'(*#6'"%-("2'*#9)"6+"+7+*#!.5/",#!3+*)"
6'*#!.5"4##!2"#$%&'$'!()*')"4+!6.##&-*")0,(*)6('"2'6&)*)('"M!"6&),)"2'"0)=5L
class Form {
protected:
int *params;
public:
virtual int read() = 0;
virtual void paint() = 0;
virtual void status(char *s) = 0;
};
D'*#9)*')"2#!"6&),)"2'"0)=5"7#"#$%&'$'!()*')"4+!6.##&-*"6)*'",+!("6)#6)('"!'",6+('7('"2'"6*')*')"2'"
!-#"4+!6.##"6+")6'&)7#",6-%"2)*"6+"!+$'"2#4erite:
3
Paradigme de Programare
Laboratorul 1
// LineForm functions
int LineForm::read() {
void LineForm::paint() {
1.3.3. 52-"3&;"#;%&566
#include <stdio.h>
#include <conio.h>
#include <graphics.h>
#include <stdlib.h>
#include <string.h>
char read_buffer[1000];
char prompt[100];
class Form {
protected:
int *params;
public:
virtual int read() = 0;
virtual void paint() = 0;
virtual void status(char *s) = 0;
};
void graph_init();
Form* get_command();
Form* forms[] = {
4
Paradigme de Programare
Laboratorul 1
void main () {
clrscr();
graph_init();
sprintf(prompt, "enter command");
Form *form;
while(1) {
gotoxy(1, 1); clreol(); fflush(stdin);
printf("[%s]> ", prompt);
gets(read_buffer);
sprintf(prompt, "");
form = get_command();
if (form) {
form->paint();
form->status(prompt);
} else {
if (strcmp(read_buffer, "exit") == 0) break;
if (strcmp(read_buffer, "clear") == 0) {
cleardevice();
sprintf(prompt, "enter command");
continue;
}
if (!strlen(prompt)) sprintf(prompt, "invalid
command");
}
}
closegraph();
}
void graph_init() {
int gd = DETECT, gm;
initgraph(&gd, &gm, "c:\\borlandc\\bgi");
}
Form* get_command() {
for (int i=0; i<n_forms; i++) {
if(forms[i]->read()) {
return forms[i];
}
}
return NULL;
}
// LineForm functions
int LineForm::read() {
int res; char *s;
res = sscanf(read_buffer, "line(%d,%d,%d,%d%s",
params, params+1, params+2, params+3,
s);
if (res == 5 && strcmp(s, ")") == 0) return 1;
else {
if (strcmp(read_buffer, "help line") == 0) {
sprintf(prompt, "line(int x1, int y1, int x2,
int y2)");
}
return 0;
5
Paradigme de Programare
Laboratorul 1
}
}
void LineForm::paint() {
line(*params, *(params+1), *(params+2), *(params+3));
}
// CircleForm functions
int CircleForm::read() {
int res; char *s;
res = sscanf(read_buffer, "circle(%d,%d,%d%s",
params, params+1, params+2, s);
if (res == 4 && strcmp(s, ")") == 0) return 1;
else {
if (strcmp(read_buffer, "help circle") == 0)
sprintf(prompt, "circle(int x, int y, int
radius)");
return 0;
}
}
void CircleForm::paint() {
circle(*params, *(params+1), *(params+2));
}
1.4. <(0%
^>(#!2'.#")%).#)"-4'*#!2",+%-*("%'!(*+"$)#"$+&('"4-*$'"3'-$'(*#6'"G%'"&N!35"6-$)!2)"2'"2','!)*'"
M!",#!'/"!+"+#().#"2'"-%.#+!')"help).
?'%#,().#"M!"6-2"&-6).##&'"+!2'"(*'0+#'"#!,'*)('"2'6&)*).##"7#"#$%&'$'!(5*#"2'"4+!6.##"%'!(*+")"%+(')"
#!('3*)"6-$%&'("-"!-+5"4-*$5"M!")%).#'8
F'"&N!35"6'&'"2-+5"4-*$'",#$%&'"2'1)"%*'='!()('/"M!6'*6).#",)")25+3).#")&('&'"!-#L"(*#+!3K#/"%)(*+&)('*/"
elipsa.
B0,'*9).#"2'"'>'$%&+"6)"%'!(*+"+!"%)(*+&)('*"!+$5*+&"2'"%)*)$'(*#"6*'7('"2',(+&"2'"$+&("#)*"6-$)!2)"
2'9#!'"6)$"2#4#6#&"2'"4-&-,#(8" !6'*6).#"M!")6',(",'!,",)"9'!#.#"M!")1+(-*+&"+(#&#=)(-*+&+#"#$)3#!N!2"!#7('"
9)*#)!('"'>%*',"%'!(*+")!+$#('"4-*$'"3'-$'(*#6'8"?'"'>'$%&+"%'!(*+"+!"%5(*)("',('"!'9-#'"2'"+!"
punct, o dimensi+!'",#"+!"%)*)$'(*+"6)*'",)"2')"%-=#.#)"%5(*)(+&+#"4).5"2'"%+!6(+&"2)("G2'"'>'$%&+"
6-!,#2'*5$"%5(*)(+&"6+"&)(+*#&'"%)*)&'&'_%'*%'!2#6+&)*'"6+"$)*3#!#&'"'6*)!+&+#/"%+!6(+&"2)("+!"6-&.")&"
%5(*)(+&+#/"#)*"%)*)$'(*+&"(*'0+#'"2-)*",5"#!2#6'"6)2*)!+&"M!"6)*'",'")4&5"%5(*)(+&O",)+"%+('$"6-!,#2'*)"
%5(*)(+&"M!"-*#6'"+!3K#"7#")(+!6#")9'$"!'9-#'"2'"+!"%)*)$'(*+"6)*'",5"#!2#6'"+!"+!3K#H8"U-3#6)")%)(5"
6
Paradigme de Programare
Laboratorul 1
%'!(*+"%5(*)(",'"%-)('"'>(#!2'"&)"2*'%(+!3K#/"+!2'")%)*'"-"!-+5"2#$'!,#+!'/"#)*"2'")#6#"&)"(*#+!3K#+&"
dreptunghic.
Se -0,'*95"%-,#0#&#()(')"2'")"2','!)"-"4-*$5"%*#!"$)#"$+&('"6-$'!=#8"@6'),()"!'"2+6'"&)"6-$'!=#"6+"
!+$'"2#4'*#('"%'!(*+")6'')7#"4-*$5",)+"!'"2+6'"6+"3N!2+&"&)"%*#!6#%#+&"2'"-9'*&-)2#!3")&"4+!6.##&-*"2#!"
&#$0)1'&'"2'"%*-3*)$)*'8"`#!N!2"6-!("2'"6-2+&"4-&-,#("%'!(*+"#!('*%*'()*')"6-$'!=#&-*/")!)&#=).#"
%-,#0#&#()(')"2'")"4-&-,#")6',("%*#!6#%#+"M!"6)=+&")6',(-*"6-$'!=#8"?'%#,().#"M!"6'"$5,+*5",'"%-)('"4-&-,#"
)6',("%*#!6#%#+"7#"+!2'"%-(")%5*')"2#4#6+&(5.#8