You are on page 1of 149

Paradigme de Programare

Laboratorul 14

Laboratorul 14
14.1. !"#$%&'($%)*(+)"',-.

Ce !"#$!%&'( &$'!)*)"+ ,!-)!./ /0$1)!234!)0')!'/'/-#'5!6$!/!#+ $7#8$)!7 #0$75!%&!20+)7'9:!


logging. Logging-, !)0')!7)#!"#$!7/",&5!');&$75!./ /0$'5!+)&'1,!#!%&8) )<)!7/"+/1'#")&', !
,&,$!0$0')"=!>&!./1"#!0#!7)#!"#$!0$"+ 5?! /<<$&<-, !#.$6)#@5!")0#A)!7#1)!-)071$,!/+)1#8$$ )!
).)7',#')=!>&!+)1$/#-#!-)!-)@B/ '#1)!#!#+ $7#8$)$!+/#')!.$!./ /0$'!+)!+/0'!-)!-)C,<<)1?!.$$&-!-)!
# '.) !7) !"#$!1)@/&#C$ !"/-!-)!#!.#7)!-)C,<<!+)!/!#+ $7#8$)!-$0'1$C,$'5=

D)7#&$0") )!./ /0$')!#7',# !+)&'1,! /<<$&<!$"+ )")&')#@5!#0+)7') )!0+)7ifice logging-ului


+1$&'1)!/+)1#8$$ )!-$&! /<$7#!-)!C#@5!#!#+ $7#8$)$=!D#$!", '?!07;$"C51$!# )!0'1#')<$)$!-)! /<<$&<!
+/'!-,7)! #!&)7)0$'#')#!"/-$.$751$$!", '/1!"/-, )!%&!", ')! /7,1$=!4,')"!/C0)1B#!#0'.) !75!
logging-ul este un crosscutting concern, iar o abordare AOP poate ajuta la modularizarea
acestui aspect.

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$$=

Pentru exemplificare vom crea o mini-#+ $7#8$)!+)&'1,!7#1)!B/"!/.)1$!0,+/1'!-)! /<<$&<=!


2+ $7#8$#!$"+ )")&')#@5!.,&78$/&# $'#')#!"$&$"# 5!,&,$!0;/++$&<-cart. Clasa Item reprezin'5!
,&!/C$)7'!J+1/-,0K!7)!+/#')!.$!7,"+51#'LB(&-,'=

// Item.java
package shopp;

public class Item {


private String _id;

private float _price;

public Item(String id, float price) {


_id = id;
_price = price;
}

public String getID() {


return _id;
}

public float getPrice() {


return _price;
}

public String toString() {


return "Item: " + _id;
}
}

ShoppingCart 7/&8$&)!/! $0'5!7,!+1/-,0) )!7)!0)!#. 5!%&!7/6! #!,&!"/")&'!-#':

// ShoppingCart.java

1
Paradigme de Programare
Laboratorul 14

package shopp;

import java.util.*;

public class ShoppingCart {


private List<Item> _items = new ArrayList<Item>();

public void addItem(Item item) {


_items.add(item);
}

public void removeItem(Item item) {


_items.remove(item);
}

public void empty() {


_items.clear();
}

public float totalValue() {


// unimplemented... free!
return 0;
}
}

41/-,0) )!-$0+/&$C$ )!0+1)!#!.$!7,"+51#')!0,&'!1)8$&,')!%&!7 #0#!Inventory.

// Inventory.java
package shopp;

import java.util.ArrayList;
import java.util.List;

public class Inventory {


private List<Item> _items = new ArrayList<Item>();

public void addItem(Item item) {


_items.add(item);
}

public void removeItem(Item item) {


_items.remove(item);
}
}

3+)1#8$$ )!7)!+/'!.$!1)# $@#')!#0,+1#!,&,$!7/6!-)!7,"+515',1$!0,&'!/.)1$')!+1$&!7 #0#!


ShoppingCartOperator:

// ShoppingCartOperator.java
package shopp;

public class ShoppingCartOperator {


public static void addShoppingCartItem(ShoppingCart sc,
Inventory inventory, Item item) {
inventory.removeItem(item);
sc.addItem(item);
}

public static void removeShoppingCartItem(ShoppingCart sc,


Inventory inventory, Item item) {

2
Paradigme de Programare
Laboratorul 14

sc.removeItem(item);
inventory.addItem(item);
}
}

M/ /0$"!/!7 #05!-)!')0'!+)&'1,!#!')0'#!.,&78$/&# $'#')#!0$0')", ,$!$"+ )")&'#':

// Test.java
package shopp;

public class Test {

public static void main(String[] args) {


Inventory inventory = new Inventory();
Item item1 = new Item("1", 30);
Item item2 = new Item("2", 31);
Item item3 = new Item("3", 32);
inventory.addItem(item1);
inventory.addItem(item2);
inventory.addItem(item3);
ShoppingCart sc = new ShoppingCart();
ShoppingCartOperator.addShoppingCartItem(sc, inventory, item1);
ShoppingCartOperator.addShoppingCartItem(sc, inventory, item2);
}
}

F#75!B/"!1, #!#+ $7#8$#!&,!B/"!1)"#17#!&$"$7! #!$)6$1)!J)*7)+'(&-!7#@,1$ )!%&!7#1)!"#$!#B)"!


)1/1$! #!7/"+$ #1)K=!4)&'1,!#!')0'#!7,!#-)B51#'!.,&78$/&# $'#')#!#B)"!&)B/$)!-)!,&!0$0')"!-)!
log-#1)=!2C/1-(&-!/!0/ ,8$)!7/&B)&8$/&# 5!+)&'1,!aceasta, vom modifica codul în modul
,1"5'/1:

// Item.java
package shopp;

import java.util.logging.*;

public class Item {

private static Logger _logger = Logger.getLogger("cart");

private String _id;

private float _price;

public Item(String id, float price) {


_id = id;
_price = price;
}

public String getID() {


_logger.logp(Level.INFO, "Item", "getID", "Entering");
return _id;
}

public float getPrice() {


_logger.logp(Level.INFO, "Item", "getPrice", "Entering");
return _price;
}

3
Paradigme de Programare
Laboratorul 14

public String toString() {


_logger.logp(Level.INFO, "Item", "toString", "Entering");
return "Item: " + _id;
}
}

2+) ,1$ )!75'1)!"/-, , !-)! /<<$&<!0)!.#7!%&!"/-!#0)"5&5'/1!%&!'/#')!7 #0) )=!2"!1)"#17#'!


anterior de ce o astfel de abordare nu este cea mai de dorit. Vom vedea astfel implementare în
modul AspectJ:

// TraceAspect.aj
package shopp;

import org.aspectj.lang.*;
import java.util.logging.*;

public aspect TraceAspect {


private Logger _logger = Logger.getLogger("trace");

pointcut traceMethods()
: execution(* *.*(..)) && !within(TraceAspect);

before() : traceMethods() {
Signature sig = thisJoinPointStaticPart.getSignature();
_logger.logp(Level.INFO, sig.getDeclaringType().getName(), sig
.getName(), "Entering");
}
}

2"!1)# $@#'!,&!#0+)7'!7#1)!$-)&'$.$75!'/#')!#+) ,1$ )!-)!")'/-5!J)*7)+'(&-!7) )!-$&!%&0,6$!


#0+)7', !-).$&$'K=!N#!/!1, #1)!0)!+/#')!/C8$&)!/!$)6$1)!+1)7,"!#7)#0'#:

01.05.2007 20:50:59 shopp.Test main


INFO: Entering
01.05.2007 20:50:59 shopp.Inventory addItem
INFO: Entering
01.05.2007 20:50:59 shopp.Inventory addItem
INFO: Entering
01.05.2007 20:50:59 shopp.Inventory addItem
INFO: Entering
01.05.2007 20:50:59 shopp.ShoppingCartOperator addShoppingCartItem
INFO: Entering
01.05.2007 20:50:59 shopp.Inventory removeItem
INFO: Entering
01.05.2007 20:50:59 shopp.ShoppingCart addItem
INFO: Entering
01.05.2007 20:50:59 shopp.ShoppingCartOperator addShoppingCartItem
INFO: Entering
01.05.2007 20:50:59 shopp.Inventory removeItem
INFO: Entering
01.05.2007 20:50:59 shopp.ShoppingCart addItem
INFO: Entering

Abordarea într-/!"#&$)15!20+)7'9!%6$!+/#')!#15'#!+)!-)+ $&!#B#&'#A) )=!F)!)*)"+ ,!-#75!


-/1$"!05! /<5"!6$!$&$8$# $@51$ )!/C$)7') /1!)0')!&)7)0#1!-/#1!05!"/-$.$75"!1)<, #!-)!
identificare a punctelor de join:

pointcut traceMethods()

4
Paradigme de Programare
Laboratorul 14

: (execution(* *.*(..)) || execution(*.new(..)))


&& !within(TraceAspect);

4)&'1,!#!1)0'1$78$/&#!")'/-) )!J6$!7/&0'1,7'/1$$K!7)!'1)C,$)! /<#8$!+,')"!./ /0$!1)<, $ )!


+1)@)&'#')!%&! #C/1#'/1, !#&')1$/1=!F#75!-/1$"!%&05!")0#A)!"#$!-)'# $#')!#',&7$!7(&-! /<5"!
#+) , !,&)$!")'/-)!0#,!#!,&,$!7/&0'1,7'/1!+,')"!/C8$&)!$&./1"#8$$!0,+ $")&'#1)!./ /0$&-!
parametrul thisJoinPoint:

before() : traceMethods() && !execution(String *.toString()) {


Signature sig = thisJoinPointStaticPart.getSignature();
_logger.logp(Level.INFO, sig.getDeclaringType().getName(), sig
.getName(), createParameterMessage(thisJoinPoint));
}

private String createParameterMessage(JoinPoint joinPoint) {


StringBuffer paramBuffer = new StringBuffer("\n\t[This: ");
paramBuffer.append(joinPoint.getThis());
Object[] arguments = joinPoint.getArgs();
paramBuffer.append("]\n\t[Args: (");
for (int length = arguments.length, i = 0; i < length; ++i) {
Object argument = arguments[i];
paramBuffer.append(argument);
if (i != length - 1) {
paramBuffer.append(',');
}
}
paramBuffer.append(")]");
return paramBuffer.toString();
}

14.2. AOP cu Use-Cases

O5! ,5"!,&!)*)"+ ,!-)!#+ $7#8$)!6$!05!-)+$0'5"!%&!#7)#0'5!#+ $7#8$)!0+)7$.$7#8$$ )!0,C!./1"5!-)!


use cases=!2+ $7#8$#!'1)C,$)!05!$"+ )")&')@)!"$&$"# !"#&#<)")&', !,&,$!;/') ?!/.)1$&-!
.,&78$/&# $'58$ )!-)!C#@5:!1)@)1B51$ )!71)#')!-)!7 $)&8$!6$!7#@51$ )!6$!-)7#@51$ )!).)7',#')!-)!
75'1)!+)10/&# , !;/') , ,$=

Din punct de vedere al componentelor (clase, module) în care se poate diviza sistemul ce
'1)C,$!$"+ )")&'#'?!-$0'$&<)"!,1"5'/#1) )!J&$B) !"$&$"# K:

P,0'/")1!6$!Q/') O'#..:!actorii sistemului.


R//"!6$!R)0)1B#'$/&:!datele 7,!7#1)!#7)6'$#!/+)1)#@5=
ReserveRoom, CheckInCustomer, CheckOutCustomer: !"#$%&&'" ce pot fi efectuate
-)!75'1)!#7'/1$?!# )!751/1!1)@, '#')!0,&'!B$@$C$ )!%&!0'51$ )!-#') /1=

3C0)1B5"!75!, '$", !<1,+!-)!7/"+/&)&')!J/+)1#8$$ )K!0,&'!-$0'$&7')!%&'1)!) )?!-#1! /<$7#!


1) #'$B5! #!$"+ )")&'#1)#! /1!0)!1)<50)6')!-$B$@#'5!%&!7) ) # ')!7/"+/&)&')=!F)!)*)"+ ,?!
presupunând c5!#+ $7#8$#!)0')!-)A#!71)#'5!6$!-/1$"!05!,1"51$"!"/-, !%&!7#1)!0)!.#7)!/!
1)@)1B#1)!-)!7#")15?!7/&0'#'5"!75!'1)C,$)!05!,1"51$"!7/-, !071$0!%&!-$B)10)!7 #0):!P,0'/")1?!
R)0)1B#'$/&!6$!R//"?!6$!#0'#!-/#1!%&!7#@, !,&)$!$"+ )")&'51$!"$&$"# )?!7#1)!+1)0,+,&)!-/#1
$"+ )")&'#1)#!#7)0'/1!7 #0)=!4)!-)!# '5!+#1')?! ,(&-!-)!)*)"+ ,!7 #0#!R//"?!B/"!/C0)1B#!7) !
"#$!+1/C#C$ ?!75!+)! (&<5!7("+,1$ )!6$!")'/-) )! )<#')!)*7 ,0$B!-)!1)8$&)1)#!$&./1"#8$$ /1!

5
Paradigme de Programare
Laboratorul 14

&)7)0#1)!-)0+1)!/!7#")15?!<50$"!+/18$,&$!-$&!$"+ )")&'51$ )!-$B)10) /1!/+)1#8$$:!1)@)1B#1)?!


cazare sau decazare.

3!#C/1-#1)!234!#!$"+ )")&'51$$!0/ ,8$)$!#1!) $"$&#!#7)0')!-)@#B#&'#A)?!+,'(&-!+)1"$')!


0)+#1#1)#!7/-, ,$! )<#'!-)!/!/+)1#8$)!-$0'$&7'5!%&'1-,&!0$&<,1!#0+)7'?!7;$#1!-#75!/+)1#8$#!
1)0+)7'$B5!+1)0,+,&)!"/-$.$751$!%&!-$Berse clase.

4)&'1,!%&7)+,'!0'#C$ $"!7 #0) )!-)!C#@5?!7#1)!7/&8$&!$&./1"#8$$!7)!&,!0,&'! )<#')!%&!"/-!


)*+ $7$'!-)!/!#&,"$'5!/+)1#8$)=

package hotel;

public class Room {


private int nr;
private RoomCategory categ;

public int getNr() {


return nr;
}

public RoomCategory getCateg() {


return categ;
}

public Room(int nr, RoomCategory categ) {


this.nr = nr;
this.categ = categ;
}
}

Clasa Room !"#$"%&'"&"'()*&+%&!*+$"%&,*$"& -*%&.%&+$./$"0%&+%& %1%1-1/%2&,*% '(&3$&'"&/$,&+%&


-/%0!*$%2&,*$"& -*%&.%&./-4$1%3/%&,*%#'1&'"$/-*5&6-/%0!*$$1%&.%&,!/&+%7$"$&+%&%8%(,1'&,*$"&
intermediul unui tip enum RoomCategory:

package hotel;

public enum RoomCategory {

A(10),
B(20),
C(30),
D(40);

private int price;

public int price() {


return price;
}

private RoomCategory(int price) {


this.price = price;
}
}

Definim apoi tipul Reservation2&,*$"& -*%&.%&*%#$"&*%9%*:)*$1%&7) '/%&+%&+$7%*$/$&6'./!(%*$5&


;1%(%"/%1%&%.%"#$-1%&.'"/& -(%*-&*%9%*:-/)&3$& 1$%"/'1& -*%&7- %&*%9%*:-*%-<

6
Paradigme de Programare
Laboratorul 14

package hotel;

public class Reservation {

private Room room;


private Customer customer;

public Room getRoom() {


return room;
}

public Customer getCustomer() {


return customer;
}

public Reservation(Room room, Customer customer) {


this.room = room;
this.customer = customer;
}
}

=4.%*:)(& )&-(&7!1!.$/&+%>-&/$,'1&Customer5&? %./-&%./%& !" %,'/&.)&*%#$")&$"7!*(-#$$1%&


+%.,*%&'"& 1$%"/& %&+!*%3/%&.)&7- )&*%9%*:)*$5&@"/*-'"&.$./%(& !(,1%82&- %./-&-*&/*%4'$&.) -$4)&
'"& !"/&,%"/*'&-'/%"/$7$ -*%&3$&+*%,/'*$&,%"/*'&-&%7% /'-&-"'($/%&!,%*-#$$5&A%"/*'&/%./2&:!(&
*%#$"%&+%! -(+-/)&'"&$+&,%"/*'&-&,'/%-&+$./$"0%&+$7%*$#$& 1$%"#$<

package hotel;

public class Customer {


private int id;

public int getId() {


return id;
}

public Customer(int id) {


this.id = id;
}
}

B$:%*.%&%1%(%"/%&+%&1!0$ )&3$& !"/*!1&1%&:!(&$(,1%(%"/-&C"/*-!& 1-.)& !('")<&StaffHandler.


A*$"/*%&-1/%1%2&- %-./-&-*%&*!1'1&+%&-&#$"%&%:$+%"#-& -(%*%1!*& %&%8$./)&C"&.$./%(&,*% '(&3$&-&
*%9%*:)*$1!*&C"&-3/%,/-*%5&D!/&,%"/*'&/%./&:!(&7- %&3$&!&$"$#$-1$9-*%&-& -(%*1!*5

package hotel;

import java.util.*;

public class StaffHandler {

private List<Room> rooms = new ArrayList<Room>();


private List<Reservation> reservations = new
ArrayList<Reservation>();

public StaffHandler() {
testInits();
}

public List<Room> getRooms() {

7
Paradigme de Programare
Laboratorul 14

return rooms;
}

public List<Reservation> getReservations() {


return reservations;
}

private void testInits() {


for (int i = 0; i < 5; i++) {
rooms.add(new Room(10 + i, RoomCategory.A));
rooms.add(new Room(20 + i, RoomCategory.B));
rooms.add(new Room(30 + i, RoomCategory.C));
rooms.add(new Room(40 + i, RoomCategory.D));
}
}
}

AE")&C"&- %./&(!(%"/&-:%(& 1-.%& %&*%,*%9$"/)&+-/%1%&3$& !"/*!1'1&-.',*-&- %./!*&+-/%2&7)*)&-&


$(,1%(%"/-&C"&(!+&%8,1$ $/&:*%'"-&+$"/*%&!,%*-#$$1%&.,% $7$ %&.$./%('1'$5

Pentru implementarea acestora vom folosi aspectele, pentru ca tot codul relativ la fiecare
!,%*-#$%&.)&7$%&.%,-*-/&C"/*-un modul propriu.

package hotel;

public aspect ReserveRoomAspect {

private boolean Room.available;

public void Room.setAvailability(boolean value) {


available = value;
}

public boolean Room.isAvailable() {


return available;
}

private Room StaffHandler.getAvailableRoom(RoomCategory categ) {


for(Room room : getRooms()) {
if (room.isAvailable() && room.getCateg() == categ) {
return room;
}
}
return null;
}

public void StaffHandler.makeReservation(Customer customer,


RoomCategory categ) {
Room foundRoom = getAvailableRoom(categ);
if (foundRoom != null) {
Reservation res = new Reservation(foundRoom, customer);
getReservations().add(res);
foundRoom.setAvailability(false);
}
}
}

F%9%*:-*%-&'"%$& -(%*%&+%& )/*%&'"& 1$%"/&.%&7- %&,*$"&$"/%*(%+$'1&-.,% /'1'$&


ReserveRoomAspect5&G-$&C"/E$&!4.%*:)(& )&.%&7!1!.%. &+% 1-*-#$$&$"/%*/$,&7- $1$/-/%&+%&

8
Paradigme de Programare
Laboratorul 14

.$"/-8-&?.,% /H5&?./7%12&(!+$7$ )*$1%&"% %.-*%&C"& 1-.-&F!!(&1%0-/%&+%& *%-*%-&'"%$&*%9%*:)*$&


-'&7!./& *%-/%&C"&- %./&-.,% /5&?3-+-*& 1-.%$&F!!(&$&.%&(-$&-+-'0)&'"&,-*-(etru: available,
printr-!&:-*$-4$1)&,*$:-/)&3$&(%/!+%1%&,'41$ %&+%&- %.&1-&- %-./-5

D!/&-/'" $& E"+&.%&7- %&!&*%9%*:-*%&.%&:%*$7$ )&(-$&C"/E$&+- )&%8$./)&!& -(%*)&+%&/$,'1& %1'$&


+!*$/2&$-*&- %-./-&.)&7$%&1$4%*)5&6'(&,*!,*$%/-/%-& -*%&.,'"%&+- )&!& -(%*)&%./%&1$4%*)&-&7!./&
-+)'0-/)&+%& )/*%&- %./&-.,% /2&-/'" $&3$&!&(%/!+)& %&7!1!.%3/%&- %-./)&,*!,*$%/-/%&-*&/*%4'$&.)&
7$%&+%7$"$/)&/!/&C"&- %./&-.,% /&3$&"'&+$*% /&C"& 1-.-&*%.,% /$:)5&?./7%12&-.,% /'1&-+-'0)&1-& 1-.-&
+%& !"/*!1&I/-77J-"+1%*&!&(%/!+)& %& -'/) C"&1$./-&.-& -(%*%&,%"/*'&-&0).$&'"-&1$4%*)&3$&+%&
/$,'1&+!*$/&+%& )/*%& 1$%"/<&getAvailableRoom5&=4.%*:)(& )&- %-./)& 1-.)2&C"& -9&+%&$".' %.2&
.%&*%/'*"%-9)&:-1!-*%-&null.

F!1'1&,*$" $,-1&-1&- %./'$&-.,% /&%./%&- %1-&+%&-& *%-&!&*%9%*:-*%5&D!/& %&-(&7) '/&,E")&- '(&


-'&7!./&%1%(%"/%&->'/)/!-*%5&=&"!')&(%/!+)&.%&:-&-+)'0-&1-& 1-.-&I/-77J-"+1%*&,%"/*'&-&$"$#$-&
7$*'1&,-3$1!*&"% %.-*$5&? %-./-&,*$(%3/%& -&,-*-(%/*'& 1$%"/'1&3$&,-*-(%/*$$&+%& )'/-*%5&B- )&
0).%3/%&!& -(%*)& !*%.,'"9)/!-*%&-/'" $&.%&7- %&*%9%*:-*%-5&F%9%*:-*%-& !"./)&%7% /$:&C"&
*%-*%-&'"%$&"!$&$"./-"#%&+%&/$,&F%.%*:-/$!"2&-+)'0-*%-&- %./%$-&1-&1$./-& 1-.%$&+%& !"/*!12&
,*% '(&3$&. K$(4-*%-&./)*$$& -(%*%$&*%9%*:-/%& -*%&"'&(-$&%./%&-./7%1&1$4%*)5

I)&,*%.','"%(&,%"/*'&.$(,1$/-/%& )&'"& 1$%"/&.%&,!-/%& -9-&,*$"&- %,/-*%-&+%& )/*%&


,%*.!"-1'1&K!/%1'1'$&-&*%9%*:)*$$& *%-/%&+%&%1&C"&,*%-1-4$15&A%"/*'&- %-./-2&!& -(%*)2&,%&1E"0)&
7-,/'1& )&%./%&! ',-/)2&/*%4'$%&.)&(-$&*%#$")&3$& 1$%"/'1& -*%&.--& -9-/&C"&- %-& -(%*)5&;./%&
"% %.-*)&-./7%1&$".%*-*%-&'"%$&"!$ ,*!,*$%/)#$& 1-.%$&F!!(<

package hotel;

public aspect CheckInCustomer {

private Customer Room.checkBy = null;

public Customer Room.getCheckBy() {


return checkBy;
}

public void Room.setCheckBy(Customer value) {


checkBy = value;
}

public void Room.uncheck() {


setCheckBy(null);
}

public void StaffHandler.makeCheckIn(Reservation res) {


res.getRoom().setCheckBy(res.getCustomer());
//consume reservation
getReservations().remove(res);
}
}

=,%*-#$-&C"&.$"%&%./%&+%&-.%(%"%-&$"/*!+'.)&C"& 1-.-&+%& !"/*!1&3$& !"./)&C"&%1$($"-*%-&


*%9%*:)*$$&.$&-/*$4'$*%-& -(%*%$&*%.,% /$:%& 1$%"/'1& -*% .%& -9%-9)5

L-&+% -9-*%&- %-./)&1%0)/'*)&.%&*',%2&$-*& -(%*-&.%&.%/%-9)& -&7$$"+&1$4%*)5

9
Paradigme de Programare
Laboratorul 14

package hotel;

public aspect CheckOutCustomer {

public void StaffHandler.makeChekcOut(Room room) {


room.uncheck();
room.setAvailability(true);
}
}

? %./%& 1-.%&M$" 1'.$:&/$,'*$1%&%"'(&3$&-.,% /N&+%7$"%. &'"&. K%1%/&+%&4-9)&-1&.$./%('1'$&+%&


(-"-0%(%"/&-1&*%9%*:)*$1!*&1-&'"&K!/%15&A%"/*'&-&/%./-&- %./%& 1-.%&+%& !"/*!1&.$&+-/%2&%./%&
"%:!$%&+%&!&$"/%*7-#)&'/$1$9-/or.

6*%-#$&!&-,1$ -#$%&+%&/%./& -*%&.)&,%*($/)&.$('1-*%-& %1!*&O&!,%*-#$$&+%&4-9)&$(,1%(%"/-/%&+%&


)/*%&.$./%(5

P+%"/$7$ -#$&%1%(%"/%1%& K%$%& %&/*%4'$%&%8/$".%&,%"/*'& -&-,1$ -#$-&.-&7$%& E/&(-$&*%-1$./)&M%85&1-&


*%9%*:-*%& 1$%"/'1&-1%0%&3$&,%*$!-+-2&+',)& -*%&.%& -1 '1%-9)&'"&,*%#&,%&- %-&,%*$!-+)N5

=+-/)&*%-1$9-/)&- %-./)&$(,1%(%"/-*%2&0E"+$#$&!&(!+-1$/-/%&+%&-&%8/$"+%&!&7'" #$!"-1$/-/%<&+%&


%82&-/'" $& E"+&"'&.%&0).%. & -(%*%&+%&/$,'1&+!*$/&1$4%*%2&.)&.%&*%-1$9%9%&!&1$./)&+%&-3/%,/-*%5&
? %-./)&%8/*-&7'" #$!"-1$/-/%&/*%4'$%&$(,1%(%"/-/)&C"&(!+&$+%"/$ & '(&-'&7!./&$(,1%(%"/-/%&
%1%&+%&4-9)2&-+$ )&7)*)&-&(!+$7$ -& !+'1&+%>-&%8$./%"/&M$" 1'.$:&-.,% /%1%N5

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.

,-"./0($'%&*"1"."#((."!'1&'2!"#!$%$!&. Ingineria software a parcurs un drum lung de la


0(%,$@&0&'0$')(5&0'/&'%$;()+'3?)+'0$'3$!$/(#%&0&'3!"-&/2!$0+';('"!(&)*$*+'",(&-*9'A"020')"(0"!'
%&*"/"0"#(('&.*&'/&'$'"1&!(';$).$'2)&('$)$0(4&'$'."027((0"!'/&'0$'2)')(5&0'*"*'%$('6)$0*9'B"027((0&'
putând deveni astfel tot mai c"%30&C&:'$)$0(4$';('(%30&%&)*$!&$'$-&.*"!$'/&5()&'*"*'%$('#!&2'
de controlat, ajungându-.&'$.*1&0'0$')&-&.(*$*&$'2)"!')"('%&*"/"0"#(('-$!&'.+'$@2*&'0$'
!&4"05$!&$'1$-(0+'$')"(0"!'3!"5"-+!(9'D.*1&0:'/23+'-&'3!"#!$%$!&$'3!"-&/2!$0+'$'()*!"/2.'
abstractizarea fu)-7(")$0+:'($!'3!"#!$%$!&$'"!(&)*$*+'",(&-*'$'()*!"/2.'$,.*!$-*(4$!&$'
",(&-*2$0+:'3!"#!$%$!&$'"!(&)*$*+'$.3&-*'()*!"/2-&'$,.*!$-*(4$!&$'3!",0&%&(:'$'$.3&-*202('
(concern).

Un aspect, un interes (concern<'&.*&'"'-&!()7+'.3&-(1(-+'-$!&'*!&,2(&'.+'6)/&30()&$.-+'$)2%(*&'


.3&-(1(-$7(('3&)*!2'$'.&'6)-$/!$'-"&!&)*'6)'.(.*&%20'/()'-$!&'1$-&'3$!*&9'E)'sistem software
&.*&'"'%207(%&'/&'$.*1&0'/&'()*&!&.&'-&'-")02-!&$4+9'F&'&C&%302'2)'.(.*&%',$)-$!'&.*&'2)'.&*'
format din mai multe interese, printre care: managementul cl(&)7(0"!';('$0'$)#$@$7(0"!:'
-")*!"020'-")*2!(0"!';('$0'*!$)4$-7((0"!:'3&!.(.*&)7$';('.&-2!(4$!&$'*2*2!"!'&)*(*+7(0"!:'
(%30&%&)*$!&$'0"#(-(('/&'$--&.'0$'/(1&!(*&'!&.2!.&';9$9'D-&.*&'$.3&-*&'3"*'1('#!23$*&'6)'/"2+'
-$*&#"!((='$.3&-*&0&'-&'7()'/&'12)-7(")$0(*$*&$'-&)*!$0+'>core concerns<';('-&0&'3&!(1&!(-&'-&'
()*&!$-7(")&$4+'.*!?).'-2'%$('%20*&'$.3&-*&'-&)*!$0&'>crosscutting concerns). Acestea din
2!%+'.2)*'$.3&-*&0&'-&'7()'/&'",(&-*20'3!"#!$%+!(('"!(&)*$*&'$.3&-*9

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

13.1.1. Identificarea aspectelor periferice (crosscutting concerns)

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:

13.1.2. Aspecte legate de AOP

!"#!$%$!&$'"!(&)*$*+'$.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

13.2.1. Aspecte periferice în AspcetJ (crosscutting)

D.3&-*L'/&1()&;*&'/"2+'%"/2!('/&'().&!$!&'$'%"/ulelor periferice (crosscutting):

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

1) Exemplu de program AspectJ


// Sample.java
package test;

public class Sample {

public static void sendMessage(String message) {


System.out.println(message);
}

public static void main(String[] args) {


sendMessage("message to send");
}
}

// SampleAspect.aj
package test;

public aspect SampleAspcet {

pointcut messageSending() : call (* Sample.sendMessage(..));

before() : messageSending() {
System.out.println("a message is about to be send");
}

J&;(!&$'6)'2!%$'!20+!(('$-&.*2('3!"#!$%'&.*&=

a message is about to be send


message to send

13.2.2. Join Point

”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

G).+')2'*"$*&'32)-*&0&'/&'@"(n sunt accesibile pentru un aspect. Cele ce pot fi folosite se numesc


puncte de join expuse9' 2)-*&0&'/&'@"()'$2'$."-($*&';('2)'-")*&C*'3!()'-$!&'.&'3"*'",7()&'/(5&!.&'
()1"!%$7((')&-&.$!&'$*2)-('-?)/'().&!+%'"'3"!7(2)&'/&'-"/='",(&-*20'$3&0$)*:'",(&-*20'*$rget sau
$!#2%&)*&0&'*!$).%(.&'-+*!&'$3&020'2)&('%&*"/&9

Categoriile exposed join points:

4
Paradigme de Programare
Laboratorul 13

Method join points

&C&-2*(")'@"()'3"()*='-P($!'&C&-27($'-"!3202('2)&('%&*"/&
-$00'@"()'3"()*='32)-*20'2)/&'"'%&*"/+'&.*&'$3&0$*+

D-&.*&'32)-*&'/&'@"()'.2)*'/&'!&#20+'-&0&'%$('1"0".(*&9'G)*!-un program bine scris în care metodele


(%30&%&)*&$4+'"'"3&!$7(&',()&'/&1()(*+'32)-*&0&'/&'$3&0$!&'.$2'-"/20'6)'.()&'$0'%&*"/&('!&3!&4()*+'
32)-*&0&'-P&(&'2*(0&'$0&'&C&-27(&('$30(-$7(&(9

Constructor join points

D.&%&)&$'%&*"/&0"!:'/&-?*'-+'1$-'!&1&!(!&'0$'().*$)7(&!(0&'2)"!'",(&-*&';(')2'0$'$3&02!('/&'%&*"/&9

Field access join points

AspectJ expune doar accesul la variabilele care sunt membre ale claselor sau ale aspectelor. Aceste
puncte de join su)*'/&'/"2+'*(32!(='!&$/'$--&..';('8!(*&'$--&..9

Exception handler execution join points

A&3!&4()*+'&C&-27($',0"-2!(0"!'-$*-P'$*2)-('-?)/'"'&C-&37(&'&.*&'#&)&!$*+9

Class initialization join points

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.

Object initialization join points

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.

1) Exemplu de demonstrare join point


// Account.java
package test;

public abstract class Account {


private float _balance;

private int _accountNumber;

public Account(int accountNumber) {


_accountNumber = accountNumber;
}

public void credit(float amount) {


setBalance(getBalance() + amount);
}

public void debit(float amount) throws Exception {

5
Paradigme de Programare
Laboratorul 13

float balance = getBalance();


if (balance < amount) {
throw new Exception("Total balance not sufficient");
} else {
setBalance(balance - amount);
}
}

public float getBalance() {


return _balance;
}

public void setBalance(float balance) {


_balance = balance;
}

public static void main(String[] args) throws Exception {


SavingsAccount account = new SavingsAccount(12456);
account.credit(100);
account.debit(50);
}
}

// SavingsAccount.java
package test;

public class SavingsAccount extends Account {

public SavingsAccount(int accountNumber) {


super(accountNumber);
}
}

// JoinPointTraceAspect.aj
package test;

public aspect JoinPointTraceAspect {

private int _callDepth = -1;

pointcut tracePoints() : !within(JoinPointTraceAspect);

before() : tracePoints() {
_callDepth++;
print("Before", thisJoinPoint);
}

after() : tracePoints() {
print("After", thisJoinPoint);
_callDepth--;
}

private void print(String prefix, Object message) {


for (int i = 0, spaces = _callDepth * 2; i < spaces; i++) {
System.out.print(" ");
}
System.out.println(prefix + ": " + message);
}
}

6
Paradigme de Programare
Laboratorul 13

13.2.3. Aspects

F&-0$!$7($'2)2('$.3&-*'.&$%+)+'1"$!*&'%20*'-2'-&$'$'2)&('-0$.&=

[access specification] aspect <AspectName>


[extends class-or-aspect-name]
[implements interface-list]
[<association-specifier>(Pointcut)] {
... aspect body
}

$.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)'%"/'/(!&-*

13.3. Sintaxa de baz+ AspectJ


13.3.1. Poincuts

O0&%&)*&0&'3"()*-2*'(/&)*(1(-+'6)'&C&-27($'3!"#!$%202('32)-*&0&'/&'@"()9 Un pointcut este folosit


3&)*!2'$'/&1()('!&#20('$.23!$'32)-*&0"!'/&'@"()'3&'-$!&'0&'(/&)*(1(-+9

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

[access specifier] pointcut pointcut-name([args]) : pointcut-definition

În definirea pointcut-urilor se pot folosi wildcard-uri atunci când s&'/"!&;*&'(/&)*(1(-$!&$'1$-(0+'$'%$('


multor puncte de join:

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

OC&%30&'/&';$,0"$)&'/&'.&%)+*2!('-&'3"*'1('(/&)*(1(-$*& folosind wilcard-2!(';('"3&!$*"!(=

Account tipul Accoutnt


*Account "!(-&'*(3'-&'.&'*&!%()+'-2'-25?)*20'D--2)*

7
Paradigme de Programare
Laboratorul 13

java.*.Date H!(-&'*(3'F$*&'-&'.&'$10+'6)*!-un subpachet java: java.util.Date sau


java.sql.Date
public void Account.set*(*) 2)'.&**&!'-$!'3!(%&;*&'2)'3$!$%&*!2'/&'"!(-&'*(3
public void Account.*() "!(-&'%&*"/+'32,0(-+'/()'-0$.$'D--"2)*'-$!&')2'
3!(%&;*&'3$!$%&*!(';(')2'!&*2!)&$4+')(%(-
!public * Account.*() "!(-&'%&*"/+'-$!&')2'&.*&'32,0(-+
public Accunt.new() 2)'-").*!2-*"!'1+!+'3$!$%&*ri
* Account.* orice field de orice tip sau modificator de acces
public !final *.* "!(-&'1(&0/'/()'"!(-&'-0$.+'-$!&')2'&.*&'1()$0

Sintaxa elementelor pointcut

F23+'-$*&#"!((0&'32)-*&0"!'/&'@"()'3&'$!&'0&-$%'5+42*'$)*&!("!'$5&%'2!%+*"$!&0&'&0&%&)*&'3"()*-2*=

Elemente pointcut bazate control-flow:

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

Elemente pointcut pentru argumente

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

before() : call(* Account.*(..)) {


... authenticate the user
}

!"#$%&'(')"(*+#(,-'&-."(/"("!"#$%&'(0$-#.$*$&(/"(1+&-(&/"-.&2&#'.3(4'#5(+("!#"0%&"("6."(7"-")'.5(,-(
corpul advice atunci punctul de join capturat nu se va mai executa.

After advice

after() : call(* Account.*(..)) {


... log the return from operation
}

8+*+6&-/('#"'6.5(2+)95:(#+/$*('/;&#"(6"(;'("!"#$.'(/$05(0$-#.$*(/"(1+&-:(&-/&2")"-.(/'#5("!"#$%&'(
acestuia s-'(.")9&-'.(-+)9'*(6'$(+("!#"0%&"('(2+6.(7"-")'.53

De cele mai multe ori este de dorit ca -$9'&(,-(#'<$*($-"&("!"#$%&&(-+)9'*"(65(2&"("!"#$.'.(#+/$*(


'/;&#":(&')(,-('#"6.(6#+0(6"(2+*+6"=."(2+)9'>

after() returning : call(* Account.*(..)) {


... log the successful completion
}

?-(#'<$*(,-(#')"(/+)&9(65(.)'.59(6"0')'.(7"-")')"'(/"("!#"0%&&(putem folosi forma:

after() throwing : call(* Account.*(..)) {


... log the failure
}

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>

void around(Account account, float amount)


throws InsufficientBalanceException :
call(* Account.debit(float) throws InsufficientBalanceException)
&& target(account)
&& args(amount) {
try {
proceed(account, amount);

9
Paradigme de Programare
Laboratorul 13

} catch (InsufficientBalanceException ex) {


... overdraft protection logic
}
}

1) Exemplu around advice


// RemoteService.java
package test;

import java.rmi.RemoteException;

public class RemoteService {


public static int getReply() throws RemoteException {
if (Math.random() > 0.25) {
throw new RemoteException("Simulated failure occurred");
}
System.out.println("Replying");
return 5;
}
}

// RemoteClient.java
package test;

public class RemoteClient {


public static void main(String[] args) throws Exception {
int retVal = RemoteService.getReply();
System.out.println("Reply is " + retVal);
}
}

// FailureHandlingAspect.aj
package test;

import java.rmi.RemoteException;

public aspect FailureHandlingAspect {


final int MAX_RETRIES = 3;

Object around() throws RemoteException


: call(* RemoteService.get*(..) throws RemoteException) {
int retry = 0;
while (true) {
try {
return proceed();
} catch (RemoteException ex) {
System.out.println("Encountered " + ex);
if (++retry > MAX_RETRIES) {
throw ex;
}
System.out.println("\tRetrying...");
}
}
}
}

2) Exemplu caching pentru un algoritm de calcul factorial


// TestFactorial.java
package test;

public class TestFactorial {

10
Paradigme de Programare
Laboratorul 13

public static void main(String[] args) {


System.out.println("Result: " + factorial(5) + "\n");
System.out.println("Result: " + factorial(10) + "\n");
System.out.println("Result: " + factorial(15) + "\n");
System.out.println("Result: " + factorial(15) + "\n");
}

public static long factorial(int n) {


if (n == 0) {
return 1;
} else {
return n * factorial(n - 1);
}
}
}

// OptimizeFactorialAspect.aj
package test;

import java.util.*;

public aspect OptimizeFactorialAspect {


pointcut factorialOperation(int n) : call(long *.factorial(int)) &&
args(n);

pointcut topLevelFactorialOperation(int n) :
factorialOperation(n)
&& !cflowbelow(factorialOperation(int));

private Map<Integer, Long> _factorialCache = new HashMap<Integer,


Long>();

before(int n) : topLevelFactorialOperation(n) {
System.out.println("Seeking factorial for " + n);
}

long around(int n) : factorialOperation(n) {


Object cachedValue = _factorialCache.get(n);
if (cachedValue != null) {
System.out.println("Found cached value for " + n + ": "
+ cachedValue);
return ((Long) cachedValue).longValue();
}
return proceed(n);
}

after(int n) returning(long result) : topLevelFactorialOperation(n) {


_factorialCache.put(n, result);
}
}

13.4. Bibliografie

2003,Wiley Publishing, Mastering AspectJ, Joseph D. Gradecki, Nicholas Lesiecki

2004,Addison Wesley Professional, Eclipse AspectJ: Aspect-Oriented Programming with


AspectJ, By Adrian Colyer, Andy Clement, George Harley, Matthew Webster

2004,O'Reilly, AspectJ Cookbook, By Russell Miles

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

!"#$!%&#&'($)*$+,!)&%,!#&' !"#$%&' =$#$-&-(')$2,&%1+&!'*&%,+.'!'81-,+1".1'($)*$+,!+&!'4%,+&'(#!-&5'


;(&-,'0+.*'(.*+1%8&'?'2!"#$!%&@'Template Method 21'Intepreter5'A&)*#!,&'B&,C$8'-&'+&=&+/'#!'$'
metod/'(&'+&*+&D1%,/'$'8&=1%131&'!"-,+!(,/'!'.%.1'!#0$+1,)5';#0$+1,).#'&-,&'8&=1%1,'*!-'(.'*!-9'=1&(!+&'
*!-'!*&#7%8'$'$*&+!31&'!"-,+!(,/'-!.'$'$*&+!31&'*+1)1,1E/5'F'-."(#!-/'(&'&>,1%8&'(#!-!'4%'(!.D/'
($)*#&,&!D/'!#0$+1,).#9'$=&+1%8'1)*#&)&%,/+1'($%(+&,&')&,$8&#$+'!"-,+!(,&5'G%'H%,&+*+&,&+'&-,&'$'
0+!)!,1(/'-."'=$+)/'8&'1&+!+C1&'8&'(#!-&'(!+&'1)*#&)&%,&!D/'.%'1%,&+*+&,$+'(!'$'$*&+!31&'*&'1%-,!%3&#&'
!(&-,$+'(#!-&5

!"#$!%&#&'($)*$+,!)&%,!#&'de obiect =$#$-&-('($)*.%&+&!'$"1&(,&#$+5'G%&#&'81%,+&'!(&-,&'2!"#$!%&'


8&-(+1.'=&#.#'4%'(!+&'($$*&+&!D/'.%'0+.*'8&'$"1&(,&'&0!#&'*&%,+.'!'&=&(,.!'$'$*&+!31&'(&'%.'!+'=1'*.,.,'=1'
&=&(,.!,/'8&'.%'-1%0.+'$"1&(,5'G%'!-*&(,'1)*$+,!%,'&-,&')$8.#'4%'(!+&'!(&-,&'$"1&(,&'&0!#&'2,1.'.%&#&'
8&'(&#&#!#,&5' !"#$%.#'Observer 8&'&>&)*#.'8&=1%&2,&'$'8&*&%8&%3/'4%,+&'$"1&(,&9'.%'&>&)*#.'(#!-1('
=11%8'-1-,&).#'MVC IB$8&#'– View – J$%,+$##&+K9'.%8&',$!,&'E1D.!#1D/+1#&'.%.1')$8&#'-.%,'4%2,11%3!,&'
$+1(7%8')$8&#.#'421')$81=1(/'-,!+&!5';#,&'2!"#$!%&'4%(!*-.#&!D/'($)*$+,!+&!'4%,+-.%'$"1&(,'21'8&#&!0/'
(&+&+1#&'(/,+&'!(&-,'$"1&(,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)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;

public class MessageBoard extends Observable {


private String message;

public String getMessage() {


return message;
}

public void changeMessage(String message) {


this.message = message;
setChanged();
notifyObservers(message);
}

public static void main(String[] args) {


MessageBoard board = new MessageBoard();
Student bob = new Student();
Student joe = new Student();
board.addObserver(bob);
board.addObserver(joe);
board.changeMessage("More Homework!");
}
}

// Student.java
package test;

import java.util.Observable;
import java.util.Observer;

class Student implements Observer {


public void update(Observable o, Object arg) {
System.out.println("Message board changed: " + arg);
}
}

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);
}

public Observable getInputInfo() {


return inform;
}

public String getText() {


return input.getText();
}

private class InformDisplay extends Observable {


public void notifyObservers() {
setChanged();
super.notifyObservers();
}
}
// ...
}

// 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());

display = new JTextField(10);


add(display);
setTitle("Observer form");
setSize(200, 100);
setLocation(200, 100);
setVisible(true);
}

private class InputFormObserver implements Observer {


public void update(Observable ob, Object o) {
doSomeUpdate();
}
}

public void doSomeUpdate() {


display.setText(inputForm.getText());
JOptionPane.showMessageDialog(DisplayForm.this,
"This form has been updated");
}

public static void main(String args[]) {


new DisplayForm();
}
}

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@

public String toString() {


return name + " " + notes;
}

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

private ArrayList<TaskChangeObserver> observers = new


ArrayList<TaskChangeObserver>();

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@

public abstract class TaskPanel extends JPanel implements ActionListener {

public void actionPerformed(ActionEvent e) {


}

public abstract TaskChangeObserver getObsever();


}

A$!,&'(&#&'W'(#!-&'6!%&#'(!+&'E$+'&>,1%8&'A!-U6!%&#'E$+'1)*#&)&%,!'4%,+-.%'=&#'-!.'!#,.#'
1%,&+=!3!'F"-&+E&+@

interface TaskChangeObserver {
public void taskAdded(Task task);

public void taskChanged(Task task);

public void taskSelected(Task task);


}

J.)'%.',$!,&'81%,+&'&#&'!.'%&E$1&'8&',$!,&')&,$8&#&'81%'!(&!-,/'1%,&+=!3/9'E$)'=!(&'21'.%'
X+!**&+'!<.,/,$+'4%'!(&-,'-&%-'I;8!*,&+'*!,,&+%K@

class TaskChangeObserverAdapter implements TaskChangeObserver {

public void taskAdded(Task task) {


}

public void taskChanged(Task task) {


}

public void taskSelected(Task task) {


}
}

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!%&#5'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;

private JPanel controlPanel;


private JPanel editPanel;

private JButton add;


private JButton update;
private JButton exit;

private JTextField taskName;


private JTextField taskNotes;
private JTextField taskTime;

private TaskChangeObservable notifier;

private Task editTask;

public TaskEditorPanel(TaskChangeObservable newNotifier) {


notifier = newNotifier;
taskObserver = new TaskChangeObserverAdapter() {
public void taskSelected(Task task) {
editTask = task;
taskName.setText(task.getName());
taskNotes.setText(task.getNotes());
taskTime.setText("" + task.getTimeRequired());
}
};
createGui();
}

public void createGui() {


setLayout(new BorderLayout());
editPanel = new JPanel();
editPanel.setLayout(new GridLayout(3, 2));
taskName = new JTextField(20);
taskNotes = new JTextField(20);
taskTime = new JTextField(20);

8
Paradigme de Programare
Laboratorul 12

editPanel.add(new JLabel("Task Name"));


editPanel.add(taskName);
editPanel.add(new JLabel("Task Notes"));
editPanel.add(taskNotes);
editPanel.add(new JLabel("Time Required"));
editPanel.add(taskTime);

controlPanel = new JPanel();


add = new JButton("Add Task");
update = new JButton("Update Task");
exit = new JButton("Exit");
controlPanel.add(add);
controlPanel.add(update);
controlPanel.add(exit);
add.addActionListener(this);
update.addActionListener(this);
exit.addActionListener(this);
add(controlPanel, BorderLayout.SOUTH);
add(editPanel, BorderLayout.CENTER);
}

public void actionPerformed(ActionEvent event) {


Object source = event.getSource();
if (source == add) {
double timeRequired = 0.0;
try {
timeRequired =
Double.parseDouble(taskTime.getText());
} catch (NumberFormatException exc) {
}
notifier.addTask(new Task(taskName.getText(),
taskNotes.getText(),
timeRequired));
} else if (source == update) {
editTask.setName(taskName.getText());
editTask.setNotes(taskNotes.getText());
try {
editTask
.setTimeRequired(Double.parseDouble(tas
kTime.getText()));
} catch (NumberFormatException exc) {
}
notifier.updateTask(editTask);
} else if (source == exit) {
System.exit(0);
}
}

@Override
public TaskChangeObserver getObsever() {
return taskObserver;
}
}

TaskSelectorPane !" !#$%&'(#)%*(+%,!(-!(")*&!(*.!/!(+%(&*-0(,$%(.$-&*(,!(&*-0-+ $(,!1*(


2 !*&!3(42!*-&'(#)%'( '-"+%,!(.*(!5!%$6!%&+.(,!(2 !* !(,!(%)+(&*-07(2* !(!-&!($%& ),+-(8%(.$-&'7(
9$(/!%! !*#'(!5!%$6!%&+.(,!(-!.!2:$!(*(+%+$(%)+(&*-03

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;

private JComboBox selector = new JComboBox();

private TaskChangeObservable notifier;

public TaskSelectorPanel(TaskChangeObservable newNotifier) {


notifier = newNotifier;
taskObserver = new TaskChangeObserverAdapter() {
public void taskAdded(Task task) {
selector.addItem(task);
}
};
createGui();
}

public void createGui() {


selector = new JComboBox();
selector.addActionListener(this);
add(selector);
}

public void actionPerformed(ActionEvent evt) {


notifier.selectTask((Task) selector.getSelectedItem());
}

@Override
public TaskChangeObserver getObsever() {
return taskObserver;
}
}

TaskHistoryPanel !-&!(#)%*(,!(6!-*1!(8%(2* !(-!( !:$%(&)*&!()"! *:$$.!(!;!2&+*&!3(<!(*-2+.&'(


&)*&!(!5!%$6!%&!.!(/!%! *&!(,!(<+=1!2&(9$(%+(-!(/!%! !*#'(%$2$(+%+.3

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();
}

public void createGui() {


setLayout(new BorderLayout());
displayRegion = new JTextArea(10, 40);
displayRegion.setEditable(false);
add(new JScrollPane(displayRegion));

10
Paradigme de Programare
Laboratorul 12

public void taskAdded(Task task) {


displayRegion.append("Created task " + task + "\n");
}

public void taskChanged(Task task) {


displayRegion.append("Updated task " + task + "\n");
}

public void taskSelected(Task task) {


displayRegion.append("Selected task " + task + "\n");
}

@Override
public TaskChangeObserver getObsever() {
return this;
}
}

>* &!*(,!($%&! ;*:'(/ *;$2'7(+%,!(-!($%-&*%:$*#'(*2!-&!("*%!.-+ $7(* ("+&!*(2+" $%,!(


+ 6'&)* !.!?

TaskPanel select = new TaskSelectorPanel(observable);


TaskPanel history = new TaskHistoryPanel();
TaskPanel edit = new TaskEditorPanel(observable);
observable.addTaskChangeObserver(select.getObsever());
observable.addTaskChangeObserver(history.getObsever());
observable.addTaskChangeObserver(edit.getObsever());
observable.addTask(new Task());

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.

!"#$!%&#&'()*+,)+*!#& !"#$%&' 4$#$(&(,'0$2)&%3*&!'-&%)*+'!',$0-+%&'3%)&*4&5&'(!+'30-#&0&%).*i. Un


&6&0-#+'&()&'2!"#$%+#'Adapter7'8,&()!'*&!#39&!9.'$'3%)&*4!5.',$%4$*0.',+'!#)!:'$4&*3%/'$'!"()*!,)39!*&'
+%34$*0.'-&%)*+'3%)&*4&5&'/34&*3)&7';%'% %()*+" !"#$%&' *&!#39&!9.'!,&!()!'-*3%'0$2)&%3*&!'-*3<!).'/&'
#!'$',#!(.'!/!-)!):'&6-*30=%/'!-$3'3%)&*4!5!'sa în termenii adaptatului.

!"#$!%&#&'()*+,)+*!#&'de obiect /&(,*3+'0$/+*3'/&',$0-+%&*&'!'$"3&,)&#$*'1%'(,$-+#'$"53%&*33'/&'


4+%,53$%!#3).53'%$37

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).

- A&'/$*&2)&',*&!*&!'+%&3',#!(&'*&+)3#39!"3#&',!*&'(.'-$!).',$$pera cu clase neînrudite, care nu


!+'3%)&*4&5&',$0-!)3"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

În API-ul Java întâlnim un set de clase Adapter cunoscute 23'+)3#&')$)$/!).@'G3%/$H8/!-)&*:'


ComponentAdapter, ContainerAdapter, FocusAdapter, KeyAdapter, MouseAdapter and
MouseMotionAdapter.

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):

public interface Windowlistener {


public void windowClosed(WindowEvent e);
public void windowOpened(WindowEvent e);
public void windowIconified(WindowEvent e);
public void windowDeiconified(WindowEvent e);
public void windowActivated(WindowEvent e);
public void windowDeactivated(WindowEvent e);
public void windowClosing(WindowEvent e);
}

public class WindowAdapter implements WindowListner{


public void windowClosed(WindowEvent e){}
public void windowOpened(WindowEvent e){}
public void windowIconified(WindowEvent e){}
public void windowDeiconified(WindowEvent e){}
public void windowActivated(WindowEvent e){}
public void windowDeactivated(WindowEvent e){}
public void windowClosing(WindowEvent e){}
}

Pentru a testa acest principiu putem folosi un mic program de test:

import javax.swing.*;
import java.awt.event.*;

class Test extends JFrame {

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 Office implements Clean{


public void makeClean() {
System.out.println("Clean Office");
}
}

class Workshop implements Clean{


public void makeClean() {
System.out.println("Clean Workshop");
}
}

interface Extra extends Clean{


public void takeCare();
}

class Facility implements Extra{


public void makeClean() {
System.out.println("Clean Facility");
}
public void takeCare() {
System.out.println("Care has been taken");
}
}

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();
}
}

11.2.3. Exemplu Adapter pattern prin compunere

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

E%(.'&63().'/&P!'$',#!(.',&'$4&*. <!#3/!*&'/&'!/*&(.'-&%)*+'?!%/!@'CAAddress, prin metoda


isValidCanadianAddr7'8,&!()!'&()&'/&P!')&()!).'23'<&*343,!).:'%+'-$!)&'43'0$/343,!).:'/!*'
)$)+23'/$*30'(.'$'4$#$(307'N&%)*+'!,&!()!'4!,&0'+%'Adapter: CAAddressAdapter. Acest
Adapter extinde din AddressValidator, integrându-(&'!()4&#'1%'(3()&0'23'4$#$(&2)&',#!(!'3%353!#.'
CAAddress.

AddressValidator@'$4&*!'0&)$/!'!"()*!,).'3(Q!#3/8//*&((

USAddress@'$4&*.'30-#&0&%)!*&'-&%)*+'!/*&(&#&'/3%';A8@

public boolean isValidAddress(String inp_address, String inp_zip,


String inp_state) {

if (inp_address.trim().length() < 10)


return false;

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%'?!%!/!@

public boolean isValidCanadianAddr(String inp_address, String


inp_pcode,
String inp_prvnc) {

if (inp_address.trim().length() < 15)


return false;
if (inp_pcode.trim().length() != 6)
return false;
if (inp_prvnc.trim().length() < 6)
return false;

return true;
}

CAAddressAdapter@'G*!--&*'-&()&'30-#&0&%)!*&!'3%353!#.@

private CAAddress objCAAddress;

public CAAddressAdapter(CAAddress address) {


objCAAddress = address;
}

public boolean isValidAddress(String inp_address, String inp_zip,


String inp_state) {

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";

public static final String CANADA = "Canada";

private String address;

private String name;

private String zip;


private String state;
private String type;

public boolean isValidCustomerAddress() {


AddressValidator validator = null;

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);
}
}

public Customer(String _name, String _address, String _zip,


String _state, String _type) {

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

Cristopher Alexander (!5,$!/'9/:&6$%&'(!'3"6,!40/"!I'

)^",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'

10.1.1. În general, un !"#$%&!'(&)&(#(*(%+(&(,(%-.!#(/


45'627&#&'8!"#$%2#29

"!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'

10.1.2. 0(,1'.('(!& !"#$!%(#$'&2(&3'$.(1+!'(

^'(!+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

Builder Bridge Command

."6060V3! K6#36+,0! T0!"/06"

Singleton *!46"/06" `!(,/06"


C$7&%92
M"9&B+ J/4/(! `!#!$06

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

10.2.1. Factory Method

- 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&&#1C'!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&

- Clasele concrete sunt izolate8'K&,!$7,,'+%$0',[6&/7,'(!',#3&!#!$0/"!/'4&/+!&6"C'!,'#/$!;"]$('


,$+0/$7!&!'(6/"'3",$',$0!"#!(,%&',$0!"5!7!&6"'/:+0"/40!8'Z%#!&!'4&/+!&6"'3"6(%+'"2#]$',[6&/0!'
<$',#3&!#!$0/"!/'/0!&,!"%&%,'46$4"!0'9,'$%'/3/"'<$'46(%&'4&,!$08'

- !"#$##$%&'%&()*'+,%&(*-&.#&+/*)&,01#"2!-%&,!+&#3-%),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%(&,&!'!+&#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) &'(#)*+#(#,*,!-.#-+!$!"#)##

Pattern-ul =9%/#&+$% !+0!'4%3",$+'<$'4/0!-6",/'9/:&6/$!&6"'4"!/7,6$/&!C'(!9,'3/"!'#/,'#%&0'%$'9/:&6$'


non-4"!/7,6$/&8'PY,+02'#%&0!'+,0%/7,,'<$'3"6-"/#/"!'4]$('!+0!'$!4!+/"'4/'6'4&/+2'+2'/,:2'6',$+0/$72'9,'
$%#/,'%$/I'%$'+,$-%"'#/$/-!"'(!'5!"!+0"!C'%$'+,$-%"'+,+0!#'(!'5,9,!"!C'+/%'%$'+,$-%"'3%$40'(!'/44!+'&/'
6':/[2'(!'(/0!8

@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%,+$&$!&#3,-!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'

- 9+"7)+$&'%&#3,-!35%&'*)#t poate fi modificat8'`6(,5,4]$('46(%&'4/"!'46$0"6&!/[2'4"!/"!/'+,'


/44!+%&'&/',$+0/$7/'4&/+!,C'+!'36/0!'#6(,5,4/'9,'$%#2"%&'(!',$+0/$7!'(6",0'<$'/3&,4/7,!'A&,#,0/"!/'
&/'D'!+0!'(6/"'%$'4/['3/"0,4%&/"?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) &'(#)*+#(#,*,!-.#-+!$!"#)##

Pattern-ul Q29#(&, /+/#:&!/[2'6'+!",!'(!'6:,!40!'A4%#'/"'5,'46$0"6/&!'3!$0"%'(,+3&/V?'<$'(,;!"+!'


#6(/&,027,C'/4!+0!/'(!3,$[]$('(!'(/0!8'a,#:/\%&'H/;/'3!"#,0!'+!3/"/"!/'(/0!&6"'(!'#!06(!&!'(!'
3"![!$0/"!'9,'!+0!'/+05!&'%$'&,#:/\',(!/&'3!$0"%',#3&!#!$0/"!/'9/:&6/$!&6"'g%,&(!"8

@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-!)%!&#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'

- Se reduce necesitatea de generare a subclaselor. J/72'(!'J/406"V'`!0N6('$%'#/,'!+0!'


$!4!+/"2'4"!/"!/',!"/"N,!,'3/"/&!&!'(!'4&/+!'K"!/06"C'5,,$('+%5,4,!$02'4&6$/"!/'%$%,'3"6060,38

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%&!",#)$&#3%,.",%./'#&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 {

public Data(String fileName) {...};


public Data(URL url, String fileName) {....};
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 DataManager{
Data data = null;
...
if (local) {
data = new Data(localFile);
...
}
if (remote){
data = new Data(connectRemote, databaseFile);
...
}
data.write(someInfo);
data.modify(someInfo);
....
}

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);

// parseaza datele din fisier


public void formatConsistency();

KL
Paradigme de Programare
Laboratorul 10

// csv = valori sparate prin virgula


class CSVFile implements Display {

public void load(String textfile) {


System.out.println("load from a txt file");
}

public void formatConsistency() {


System.out.println("txt file format changed");
}
}

// format XML
class XMLFile implements Display {

public void load(String xmlfile) {


System.out.println("load from an xml file");
}

public void formatConsistency() {


System.out.println("xml file format changed");
}
}

// format binar
class DBFile implements Display {

public void load(String dbfile) {


System.out.println("load from a db file");
}

public void formatConsistency() {


System.out.println("db file format changed");
}
}

!%&'()*&+)&%-,%",."%&(,7,2%")'/(%-,%0)>),#%0$($.)"%'#)!%)!",#2,-)/(%/!/)%&#7/2,!"%"#)2).%1!%()!)&%
-,%*$2&!-3%&"/!*)%*F!-%.,%#/(,&93%&'()*&+)&4

// TestFactory.java
package test;

class TestFactory {

public static void main(String[] args) {


Display display = null;

// alegerea tipului o facem prin argumente in linie de comanda


if (args[0].equals("1"))
display = new CSVFile();
else if (args[0].equals("2"))
display = new XMLFile();
else if (args[0].equals("3"))
display = new DBFile();
else
System.exit(1);
// logica comuna de cod
display.load("");

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

class LuxuryCar implements Car {


private String name;

public String getCarFeatures() {


return "Luxury Car Features ";
};
}
class LuxuryVehicleFactory extends VehicleFactory {

17
Paradigme de Programare
Laboratorul 10

public SUV getSUV() {


return new LuxurySUV("L-S");
}
}

</'3%*/2%.,%$?.,#:38%&'()*&+)&%*&#,%0$($.,>",%&*,.",%*(&.,%)2'(,2,!",&93%/!%.).",2%-,%
*3/"&#,%2&>)!)%-/'3%&!/2)",%*#)",#))4%*&",7$#),%>)%")'%C',!"#/%.)2'()"&",%&*,.",&%'$"%0)%@NQ%.)%
5&#8%#,.',*"):%(/=%.&/ 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

// get one of Luxury or NonLuxury vehicle factories


VehicleFactory vf = VehicleFactory.getVehicleFactory(vhCategory);

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 &#2(#) %#
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 #-$3*&(@#)5( -6((#2(#! &1 &- 5 7#?) %!"+#
%&'(" )"*&+#.%(# !" #-*.("+#2(#two-tier.

F- 5 #%,5()%6((#!*-"#.%(#)$.,5 E #2(#- ) !("+#"& (#"(,*&(#3(/ &(" #3 #-$3*&(@#)5( -6((:#servere-le de


!"#$ %## A)%& #,&$) ! %>+#3%" 5 #, -"&*#)5( -6(B#2(#server-ele de date A)%& #!"$)' %>+#3%" 5 #/$5$!(" #3 #
servere-5 #3 #%,5()%6((B7#?) %!"+#)$-/(4*&%6( #! #-*. 2" #%&'(" )"*&+#three-tier 2(# !" #) %#.%(#3 !#
0-"C5-("+#%&'(" )"*&+#)5( -"-! 1 &7#?&'(" )"*&(5 #)%& #- ) !("+#.%(#.*5"#3 #3$*+#"(,*&(#3 #-$3*&(#! #.%(#
-*. !)#2(#multi-tiered sau n-tiered.

1
Paradigme de Programare
Laboratorul 9

Figura 9-1 - Arhitectura 3-tier

Avantajele arhitecturilor multi-"( & 3#)$-!"%*#0-#/%,"*5#)+#!*-"#.%(#!)%5%<(5 :#,&$) !%& %#/((-3#


3(!"&(<*("+#0-"& #.%(#.*5" #! &1 & #!, )(%5(>%" #0-#3(1 &! #$, &%6((:#%,5()%6((5 #3 1 -(-3#.%(#
, &/$&.%-" 7#F-#3 >%1%-"%G#%&#/(#)+#"&%/()*5#, #& 6 %# !" #.%(#.%& :#(%&#*-#%5"#3 >%1%-"%G#%&#/(#)+#
%,5()%6((5 #!*-"#.%(#4& *#3 #,&$4&%.%"#2(#3 #" !"%":#%1C-3#0-#1 3 & #/%,"*5#)+#.%(#.*5" #! &1 & H.%2(-(#
"& <*( #!+#/( #)$- )"%" #, -"&*#%#,*" %#,&$) !%#$#) & & #3 #5%#*-#)5( -"7

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$&#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$)%"$&#2(# !" #$#& / &(-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@

URL myURL = new URL(“http://www.google.com”)

?3& ! 5 #*&5#,$"#/(#3 #%! . - %#2(#& 5%"(1 #5%#%5" #%3& ! @

URL link = new URL(“http://www.ziar.ro/”);


URL linkStire = new URL (link, “sport.html”);

K5%!%#FWU#$/ &+#*-#! "#3 #. "$3 #,&(-#)%& #! #,$"#$<6(- #(-/$&.%6((#3 !,& $#%-*.("+#%3& !+@

package test;

import java.net.MalformedURLException;
import java.net.URL;

public class TestURL {

public static void main(String[] args) {


URL aURL = null;
try {
aURL = new
URL("http://www.domeniu.com:8080/dir/subdir/index.html?param=val&altparam=v
al#ancora");
} catch (MalformedURLException e) {
System.out.println(e.getMessage());
}
System.out.println("protocol = " + aURL.getProtocol());
System.out.println("authority = " + aURL.getAuthority());
System.out.println("host = " + aURL.getHost());
System.out.println("port = " + aURL.getPort());
System.out.println("path = " + aURL.getPath());
System.out.println("query = " + aURL.getQuery());
System.out.println("filename = " + aURL.getFile());
System.out.println("ref = " + aURL.getRef());
}
}

I #5%#$#%-*.("+#%3& !+#! #,$"#)("(#3%" 5 #"&(.(! #)*#%G*"$&*5#!"& %.-urilor:

package test;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;

public class ReadFromURL {


public static void main(String[] args) throws Exception {
URL tuiasi = new URL("http://www.tuiasi.ro/");
BufferedReader in = new BufferedReader(new
InputStreamReader(tuiasi.openStream()));

3
Paradigme de Programare
Laboratorul 9

String inputLine;

while ((inputLine = in.readLine()) != null)


System.out.println(inputLine);

in.close();
}
}

D #5C-4+#)5%!%#FWU#! #.%(#,$%" #/$5$s(#2(#)5%!%#URLConnection , -"&*#%#,&(.(#2(#%#"&(.(" #3%" #)+"& #


$#%3& !+#*&57#?) %!"+#)5%!+# !" #!, )(%5(>%"+#, #%3& ! #*&5#'"",:#.*5" #3(-"& #. "$3 5 #!%5 #/((-3#*"(5 #
doar folosind acest tip de adrese.

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

D&$"$)$5*5#JKD#$/ &+#$#%!"/ 5#3 #)$.*-()%& #!"%<(5+7#I$*+#-$3*&(#A)5( -"#2(#! &1 &B#!"%<(5 !)#$#


conexiune între ele, fiecare asociind câte un socket , #%) %#)$- E(*- 7#I%" 5 #!*-"#"&(.(! #2(#
& ) ,6($-%" #,&(-#%) 5#!$)N "7

F-#!$)N "#& ,& >(-"+#*-*5#3(-#) 5 #3$*+#)%, " #%5 #*- (#)$- E(*-(#0-"& #3$*+#%,5()%6((#0-#& 6 %7#F-#
!$)N "# !" #5 4%"#3 #*-#-*.+&#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 &#0-#)%& #! &1 &*5#! #)$.,$&"+#)%#*-# )$*:#"&(.(6C-3#. !%G 5 #0-%,$(#)+"& #)5( -":#,*6(-#
prelucrate.

?,5()%6(%#! &1 &@

// 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;

public class SimpleServer {


public static void main(String[] args) throws IOException {

ServerSocket serverSocket = null;

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);
}

Socket clientSocket = null;


System.out.println("server wait for 1 client\n");
try {
clientSocket = serverSocket.accept();
} catch (IOException e) {
System.err.println("Accept failed.");
System.exit(1);
}

PrintWriter out = new PrintWriter(clientSocket.getOutputStream(),


true);
BufferedReader in = new BufferedReader(new InputStreamReader(
clientSocket.getInputStream()));

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;

public class SimpleClient {


public static void main(String[] args) throws IOException {

Socket echoSocket = null;


PrintWriter out = null;

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);
}

BufferedReader stdIn = new BufferedReader(new


InputStreamReader(System.in));
String userInput;

while ((userInput = stdIn.readLine()) != null) {


try {
out.println(userInput);
System.out.println(in.readLine());
if (userInput.compareToIgnoreCase("bye") == 0) {
break;
}
} catch (Exception e) {
System.out.println("connection losed: " + e.getMessage());
break;
}
}

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;

public class MultiServer {


public static void main(String[] args) throws IOException {
ServerSocket serverSocket = null;

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);
}

System.out.println("wait for clients");


while (true) {
try {
Socket clientSocket = serverSocket.accept();
new ServerClientThread(clientSocket);
} catch (Exception e) {
e.printStackTrace();
break;
}
}
serverSocket.close();
}
}
// ServerClientThread.java
package test;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class ServerClientThread extends Thread {


private Socket socket = null;

public ServerClientThread(Socket socket) {


this.socket = socket;
start();
}

public void run() {


System.out.println("start new client thread");
try {
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new
InputStreamReader(socket.getInputStream()));

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 &:#(%&#3*,+#)$- )"%& #!+#, &.("+#"&(.(" & %#. !%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.

;-) &)%6(#!+# E"(-3 6(#%,5()%6(%#)*#/%)(5("+6(#3 #<%>+#)%& #%&#,*" %#!+#/%)+#%,5()%6(%#*"(5+#0-#


,&%)"()+@

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$&#0-#.%!+#)+"& #"$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/" !"#$#%&#%#'#()*!#.

7$%&$'('$)'"*%!*+$)!,-"#$)0+#+!)").)*+2/'"8!"#'$'9)9"'"('/"(+9,%$",'0:-uri, acest lucru fiind posibil


doar pe un si0,)("1)"%#)$'$)"(+9,/,'0:/!&";<!/.=">/!1%?0@A"7$%*)0)9)"#%,"B/"C-4+,)"*'"B//!1"'#9/*'2//"
sau programe care la rândul lor pot comunica cu alte procese.

!"#$%"&'"'(')*+$'"',-'".",*))',$*!'",')/'!+$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%&&#2/"3

public class FirDeExecutieRunnable implements Runnable {

public FirDeExecutieRunnable() {}

@Override
public void run() {
// codul executat de firul de executie
}

public static void main(String[] args) {


// crearea unei instante a clasei FirDeExecutieRunnable
FirDeExecutieRunnable f = new FirDeExecutieRunnable();
// crearea unei instance a clasei Thread ce primeste ca parametru un
obiect Runnable
Thread t = new Thread(f);
// lansarea firului de executie
t.start();
}
}

2) !"#!"#$%&%'$('!$)"$"*"+%,'"$-!'&$"*0'&)"!"#$+/#4"'$56!"#)3

public class FirDeExecutieThread extends Thread {

public FirDeExecutieThread() {}

1
Paradigme de Programare
Laboratorul 8

public FirDeExecutieThread(String name) {


super(name);
// name - numele firului de executie
}

@Override
public void run() {
// codul executat de firul de executie
}

public static void main(String[] args) {


// crearea unei instante a clasei FirDeExecutieThread
FirDeExecutieThread t = new FirDeExecutieThread();
// lansarea firului de executie
t.start();
}
}

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.

public static void sleep(long millis) throws InterruptedException


public static void sleep(long millis, int nanos) throws
InterruptedException

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!"$%#$#&#'()!#

Figura 8-1 4$)1*1"&'"/$0+2"01"*!*$"#$%"&'"'(')*+$'


(sursa: http://www.iam.ubc.ca/guides/javatut99/essential/threads/lifecycle.html)
L,-$/9)"8!"*'$)"0)"#%',)"'B9'"+!"B/$"1)").)*+2/)"9'"+!"(%()!,"1',5

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*#?*&#3
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).

8.1.5. !"#$%&'()*(+!$'(#*(,%$(-'('.'+#/%'(01!2'(!3#*4'(-%*(52!$ea Not Runnable în


starea Runnable
G'%($'$:)!"$'8#-'"($7#")0'$sleep()9$'"1+%*$:*&1-$#5#%1,*#$'B1+C#$6+$!"'&#'$H1++'2-#$018($
scurgerea intervalului de timp specificat.
G'%($'$:)!"$'8#-'"($7#")0'$wait()9$'"1+%*$1+$'-"$:*&$0#$#5#%1,*#$"&#21*#$!(-l informeze d'%($
'%#'$%)+0*,*#$#!"#$6+0#8-*+*"($!'1$+1$I:)-)!*+0$7#")0#-#$notify() ?*$notifyAll() din clasa
Object).
G'%($:*&1-$#!"#$2-)%'"$6+"&-)$)8#&',*#$0#$*+"&'&#E*#?*&#9$'"1+%*$:*&1-$&#0#<*+#$Runnable când
)8#&',*1+#'$&#!8#%"*<($!-a terminat.

8.1.6. Metoda isAlive()


Acea!"($7#")0($&#"1&+#'@(D

true9$0'%($:*&1-$0#$#5#%1,*#$'$:)!"$8)&+*"$?*$+1$'$:)!"$)8&*"$I#!"#$6+$!"'&#'$Runnable sau Not


Runnable)
false9$0'%($:*&1-$0#$#5#%1,*#$#!"#$:*#$6+$!"'&#'$New Thread, fie în starea Dead.

3
Paradigme de Programare
Laboratorul 8

8.1.7. 6'$7%*!$'!(#*#%(,%$(-'('.'+#/%'
Pentru ca un fi&$0#$#5#%1,*#$!($!#$"#&7*+#$"&#21*#$%'$7#")0'$run() !(-?*$"#&7*+#$#5#%1,*'3$ 5*!"($0)1($
7#")0#$8#+"&1$"#&7*+'&#'$1+1*$:*&$0#$#5#%1,*#D

Metoda run() 6?*$"#&7*+($#5#%1,*'$6+$7)0$+'"1&'-D$0'%($'<#7$*+!"&1%,*1+*$%1$"*78$0#$#5#%1,*#$


finit sau bucle finite.
Se f)-)!#?"#$)$<'&*'2*-($0#$"#&7*+'&#D$0'%($7#")0'$run() "&#21*#$!($#5#%1"#$)$21%-($*+:*+*"(3$
J#&*)0*%$!#$*+"#&)C/#'@($<'&*'2*-'$&#!8#%"*<($?*$0'%($#!"#$6+0#8-*+*"($%)+0*,*'$0#$"#&7*+'&#$!#$
*#!#$0*+$21%-(3

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'&#9$0'&$+1$#5*!"($+*%*$)$C'&'+,*#$6+$'%#!"$!#+!$0#)'&#%#$!*!"#71-$0#$)8#&'&#$8)'"#$
interveni în alocarea cuantelor de timp.

Apelul metodei yield() din clasa Thread '&#$%'$#:#%"$)8&*&#'$"#78)&'&($'$#5#%1,*#*$"/&#'0-ului pentru a


permite celorlalte thread-1&*$!($!#$#5#%1"#3

J&*)&*"'"#'$0#$#5#%1,*#$#!"#$1+$+17(&$6+"&#C$%18&*+!$6+"&#$KLMNJHLOHL.P$?*$KQRNJHLOHL.P9$
<'-)'&#'$*78-*%*"($:**+0$MOHKNJLOHL.P3$Q%#!"#$%)+!"'+"#$!"'"*%#$!1+"$0#:*+*"#$6+$%-'!'$Thread:

public static final int MAX_PRIORITY = 10;


public static final int NORM_PRIORITY = 5;
public static final int MIN_PRIORITY = 1;

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.

8.2.1. Sincronizarea metodelor


Sincronizarea metodelor se realizeaz( cu ajutorul cuvântului cheie synchronized. Atunci când un
thread execut( o anumit( metod( a unui obiect, celelalte fire care vor s( execute aceia?i metod(
sincronizat( pentru acela?i obiect trebuie s( a?tepte ca primul fir s( termine de executat metoda
respectiv(. La un moment dat, o metod( sincronizat( poate s( fie executat( doar de un singur fir de
execu,ie.

public class ContorSincronizat {


private int contor = 0;

public synchronized void incrementeaza() {


contor++;
}

public synchronized void decrementeaza() {


contor--;
}

public synchronized int getContor() {


return contor;
}
}

8.2.2. Sincronizarea blocurilor


Spre deosebire de sincronizarea metodelor, în cazul sincroniz(rii blocurilor trebuie specificat obiectul
pentru care se realizeaz( sincronizarea. Sintaxa este: synchronized (obiect) { … }.

public class ContorSincronizat {


private int contor = 0;

public void incrementeaza() {


synchronized (this) {
contor++;
}
}

public void decrementeaza() {


synchronized (this) {
contor--;
}
}

public int getContor() {


synchronized (this) {
return contor;
}
}
}

5
Paradigme de Programare
Laboratorul 8

8.3. Exemplu
import java.io.IOException;

public class BuclaInfinita extends Thread {

private boolean stopProgram;


private int count;

public BuclaInfinita(String nume) {


super(nume);
this.stopProgram = false;
this.count = 0;
}

@Override
public void run() {
while (!stopProgram) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
count++;
}
}

public void stopProgram() {


this.stopProgram = true;
}

public int getCount() {


return count;
}

public static void main(String[] args) throws IOException {


BuclaInfinita t = new BuclaInfinita("Firul meu");
t.start();
System.in.read();
t.stopProgram();
while (t.isAlive()) {
System.out.println("Firul de executie inca nu s-a terminat");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("Au trecut " + t.getCount() + " secunde de la apasarea
tastei");
}

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.

7.1.1. Noile alternative la componentele 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.

Componente AWT Alternative Swing Ferestre AWT Alternative Swing


Button JButton Applet JApplet
Canvas JPanel Dialog JDialog
CheckBox JCheckBox FileDialog JFileChooser
CheckBox (în JRadioButton (în Frame JFrame
CheckBoxGroup) ButtonGroup) Window JWindow
Choice JComboBox
Component JComponent
Container JPanel
Label JLabel
List JList
Menu JMenu
MenuBar JMenuBar
MenuItem JMenuItem
Panel jPanel
PopupMenu JPopupMenu
ScrollBar JScrollBar
ScrollPane JScrollPane
TextArea JTextArea
TextField JTextField

7.1.2. Componente noi în Swing

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.

7.1.3. Sistemul de evenimente

>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

D(!#-2"2!"A2#,!"6("/*"+,),6$","$!6#*!83"*"')*6($"JButton care la *&36*-("/*"5(!(-*"2!"


eveniment ActionEvent<"G!#(-+*8*"',-(6&2!73#,*-("*'(6#2$"(/(!$%(!#"(6#("ActionListener
'*-("',!8$!("0,*-","%(#,03B"actionPerformed(ActionEvent actionEvent). Implementarea
*'(6#($"%(#,0("/*"',!8$!("',02)"&-$!"'*-("*&)$'*8$*"/*"-(*'8$,!a la generarea evenimentului de
'3#-("A2#,!2)"-(6&('#$/<

class MyActionListener extends ActionListener {


public void actionPerformed(ActionEvent actionEvent) {
System.out.println(”Button pressed”);
}
}

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

ActionListener actionListener = new ActionListener() {


public void actionPerformed(ActionEvent actionEvent) {
System.out.println(”Button pressed”);
}
}

!-(5$6#-*-(*"$!6#*!8($"Q$6#(!(-"

N,!6$0(-J!0"'3"*/(%"$!6#*!8$*#"2!"A2#,!B

JButton btnPressMe = new JButton(”Press me”);

&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”);
}
});

7.2. Exemplu de aplica !"#$%!&'

S,%"',!6#-2$","*&)$'*8$("'*-("63",+(-(","+2!'8$,!*)$#*#("*6(%3!3#,*-("*&)$'*8$($"N*)'2)*#,-"0$!"
Windows.

Fereastra o vom '-(*"1!"')*6*"N*)'"'("(K#$!0(".P-*%(4"$*-"&2!'#2)"0("$!#-*-("1!"*&)$'*8$("1)"/,%"


crea în clasa Main:

package demo;

public class Main {

public static void main(String[] args) {


new Calc();
}
}

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$*

private void initComponents()

&("'*-(","*&()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:

JPanel contentPane = new JPanel(new BorderLayout());


contentPane.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);

D-$%*"',%&,!(!#3"6(#*#3"(6#("=$6&)*@-2)<"?*$"1!#J$"0(')*-3%"%(%A-2)"1!"'*0-2)"')*6($

private JTextField txtDisplay;

$*-"*&,$"+*'(%"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:

txtDisplay = new JTextField();


txtDisplay.setEditable(false);
txtDisplay.setBackground(Color.WHITE);
txtDisplay.setHorizontalAlignment(JTextField.RIGHT);
add(txtDisplay, BorderLayout.NORTH);

Pentru crearea butoanelor într-2!"%,0"()(5*!#"E$"2E,-"0("%,0$+$'*#"/,%"0(+$!$"2!"#$&"(!2%"


*T2#3#,-B

public enum Commands {


BACKSPACE("Backspace"),
CE("CE"),
C("C"),
NR_7("7", 7),
NR_8("8", 8),
NR_9("9", 9),
DIV("/"),
SQRT("sqrt"),
NR_4("4", 4),
NR_5("5", 5),
NR_6("6", 6),
MUL("*"),
MOD("%"),
NR_1("1", 1),
NR_2("2", 2),
NR_3("3", 3),
MINUS("-"),
DIV_BY("1/x"),
NR_0("0", 0),
PLUS_MINUS("+/-"),
PERIOD("."),
PLUS("+"), EQUALS("=");

private int number;

private String displayText;

int number() {
return number;
}

8
Paradigme de Programare
Laboratorul 7
String displayText() {
return displayText;
}

Commands(String displayText) {
this(displayText, -1);
}

Commands(String displayText, int number) {


this.displayText = displayText;
this.number = number;
}
}

Pemtru fiecare buton avem astfel proprietatea displayText !"#!$%&'"&()&)*+,")&*"&-$!./0&12&


proprietatea number (pentru a trata în mod unic toate butoanele de la 0 la 9, pentru celelalte
implicit este +1).

32"'),"&-$!./&',")!&()&)(")&)!)1)!+&.&()%.),"&4"&!2*$%&"/$5-lui Commands. Pentru aceasta


avem nevoie de o c%)6+&'),"&6+&"#!2/4+&'%)6)&78$!!./9

@SuppressWarnings("serial")
public class CommandButton extends JButton {

private Commands cmd;

public Commands getCommand() {


return cmd;
}

public CommandButton(Commands cmd) {


super(cmd.displayText());
this.cmd = cmd;
}
}

Constructorul clasei CommandButon :.%.6"1!"&*,.*,2"!)!")&displayText a enum-ului pentru


a seta textul butonului.

;'$5&*$!"5&:.%.62&)'")6!+&'%)6+&*"/!,$&)&<*.*$%)<&-$!.)/"%"&)*%2')=2"2>&?)2&@/!A2&"#!,)B"5&
într-$/&("'!.,&!.)!"&!2*$,2%"&4"&-$!.)/"C&*"/!,$&)&',")&12&)4+$B)&-$!.)/"%"&)$!.5)!>

Commands[] cmdButtons = Commands.values();

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

F,5+!.),"%"&-$!.)/"&:)'&*),!"&42/&)%&4.2%")&B,$*&12&(.,&:2&)4+$B)!"&@/!,-un panel care are ca


%)G.$!&5)/)B",&.&2/6!)/=+&GridLayout '"&)62B$,+&)1"H),")&$/2:.,5+&@/!,-un tabel.

// 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)>

public class Calc extends JFrame implements ActionListener {

Înainte de a trece la implementarea metodei actionPerformed vom stabili unde vom


25*%"5"/!)&%.B2')&4"&:$/'=2./),"&)&')%'$%)!.,$%$2>&D"/!,$&)&*",52!"&42(",6"&5.4$,2&4"&)&!,)!)&
"("/25"/!"%"&*,.4$6"&4"&)'=2$/2%"&$!2%2H)!.,$%$2&(.5&6"*),)&*),!")&4"&):21),"&4"&*),!")&4"&
%.B2'+>&J.4$%&()&:2&)6!:"%&5)2&$1.,&4"&5.42:2')!&12&4"&$,5+,2!>

D"/!,$&)&*",52!"&)%!",/),")&@/!,"&42(",6"&25*%"5"/!+,2&)%"&%.B2'22C&(.5&4":2/2&5)2&@/!A2&.&
2/!",:)=+9

public interface CalcModel {


void processCommand(Commands cmd);
String getDisplayText();
}

Metoda processCommand 6"&)*"%")H+&42/&2/!",:)=)&FK&)!$/'2&'A/4&$/&-$!./&"6!"&)*+6)!C&2),&


prin metoda getDisplayText 6"&.-=2/"&!"#!$%&'"&!,"-$2"&):21)!&'$,"/!&'+!,"&$!2%2H)!.,>

L.5&',")&)*.2&.&25*%"5"/!),"&4":)$%!&)&)'"6!"2&2/!",:"="9

public class DefaultCalcModel implements CalcModel {

private double currentRezult;


private double currentValue;

public DefaultCalcModel() {
currentRezult = 0;
currentValue = 0;
}

public void processCommand(Commands cmd) {


if (cmd.number() != -1) {
addCifre(cmd.number());
} else {
switch (cmd) {
case BACKSPACE:
break;
case CE:
currentValue = 0;
break;
case C:

10
Paradigme de Programare
Laboratorul 7
currentValue = 0;
currentRezult = 0;
break;
}
}
}

public String getDisplayText() {


return …
}

private void addCifre(int cifre) {



}
}

M/&'%)6)&J)%'&:.%.625&.&2/6!)/=+&)&)'"6!"2&'%)6"&')&5"5-,$& 4"&:)*!&:.%.625&.&,":",2/=+&'+!,"&
2/!",:)=+09

private CalcModel model;

M/&'./6!,$'!.,&2/2=2)%2H+5&,":",2/=)&'+!,"&2/!",:)=+&'$&.&2/6!)/=+&)&$/"2&'%)6"&'"&25*%"5"/!")H+&
)'")&2/!",:)=+& '%)6)&4":)$%!&@/&)'"6!&')H09

model = new DefaultCalcModel();

;'$5&*$!"5&25*%"5"/!)&12&5"!.4)&N26!"/",-ului:

public void actionPerformed(ActionEvent e) {


CommandButton btn = (CommandButton) e.getSource();
model.processCommand(btn.getCommand());
txtDisplay.setText(model.getDisplayText());
}

I-=2/"5&2/6!)/=)&-$!./$%$2&'),"&)&B"/",)!&"("/25"/!$%C&transmitem modelului de calculator


!2*$%&'.5"/H22&*"/!,$&*,.'"6),"&4$*+&'),"&)'!$)%2H)5&!"#!$%&'+!,"&$!2%2H)!.,>

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.

6.1.1. Controalele AWT

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.

;.(#%+0'($0*.#%+#%40(%)&%)0.0"&(#%9'%$#*.&6*$#*%&'(#$)#3#&%/$*)&+#%"!'(%Scrollbar, TextArea 5&%Label.


Controale personalizate pot fi create folosind controlul Canvas: prin acestea se pot desena grafice
+!"(0-&6*(#%5&%"#%40(%&-4.#-#'(*%1&:#$"#%#:#'&-#'(#7

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

Figura 6-1 – O ierarhie a controalelor din AWT

I#%.E'/2%*+#"(#%+0-40'#'(#B%;JK%-*&%+!4$&'1#%0%"#$&#%1#%+.*"#%+*$#%*G!(2%.*%1#"#'*$#%5&%.*%+0'($0.!.%
evenimentelor.

6.1.2. Controlul evenimentelor (începând din AWT 1.1)

Î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

;(!'+&%+E'1%"#%+0'"($!&#5(#%0%+.*"2%1#"(&'*(2%"2%asculte anumite evenimente, se iau în calcul 3


elemente:

- &-4.#-#'(*$#%&'(#$)#3#&%40($&:&(#%4#'($!%(&4!.%1#%#:#'&-#'(#%*"+!.(*(<

public class MyListener implements ActionListener…

- î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(*(#,<

public void actionPerformed(ActionEvent e) {


!""#$%&'$'()*+'!*,-#.('
}

;+#"(%-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

P0.0"#5(#%U%60'#%4#'($!%*%9-42$3&%"4*3&!.%/#"(&0'*(<%North, South, East, West 5&%Center.


V0'*%D#'(#$%0+!42%+E(%1#%-!.(%"4*3&!%40"&>&.B%&*$%+#.#.*.(#%"#%$#6!-2%.*%-&'&-!.%'#+#"*$%
+0-40'#'(#.0$%&'+.!"#%9'%*+#.#%60'#7%DE'1%"#%)0.0"#5(#%*+#"(%N*S0!(M*'*/#$B%.*%*12/*$#*%
+0-40'#'(#.0$%9'%+0'(*&'#$%"#%)0.0"#5(#%-#(01*%add cu 2 parametri, precizându-"#%5&%60'*%9'%
+*$#%"#%*1*!/2%+0-40'#'(*%$#"#4#+(&:27%

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

6.1.4. Suportul grafic

@'%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()

Q#%40(%1#%*"#-#'#*%*)&5*%(#H(#<%drawBytes(), drawChars(), drawString(). Pentru folosirea


unui anumit font se folosesc obiectele de tip Font:

g.setFont(new Font(name, style, size);

I#'($!%*%0>3&'#%1&-#'"&'&%"4#+&)&+#%!'!&%*'!-&(%)0'(%)0.0"&(%"#%40*(#%)0.0"&%!'%0>&#+(%1#%(&4%
FontMetrics.

?$*4C&+"%0)#$2%"!40$(%5&%4#'($!%.!+$!.%+!%&-*/&'&<

aImage = getImage(url); //numai într-un applet


aImage = Toolkit.getDefaultToolkit().getImage(fileNameOrUrl);

;)&5*$#*%&-*/&'&.0$%"#%40*(#%)*+#%4$&'%-#(01*%drawImage() a obiectului Graphics.

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

Sistemul !"#$#%& %'(#% (I/O !"#$%&'!($!)*+*!$,'$!-.-/!($,'-/!($!+"/-0&.",1!2".3&.4.(!-.!.-05%!0*%$!


($!2/*,$!6&!&.'$%#$3$7!8.!0"'&+!9$.'%-!*2$,'$!(&0$.,&-.&!*/$!:;<--/-&!<=>!$,'$!6&!#*9'-/!25!)*+*!
($#&.$6'$!?!,&,'$0$!<=>!2"09/$'$@!-.-/!9$.'%-!/-2%-/!2-!AB'$,!6&!-.-/!9$.'%-!/-2%-/!2-!caractere.

5.1.1. Stream-urile

>9$%*3&&/$!<=>!%$*/&C*'$!D.!)*+*!,-.'!A*C*'$!9$!stream-uri (fluxuri). Un stream este un obiect abstract


2*%$!#&$!9%"(-2$!&.#"%0*3&&1!#&$!/$!2".,-057!E'%$*0-urile sunt conectate la dispozitive fizice de
&.'%*%$=&$6&%$7!F$6&!*2$,'$!(ispozitive pot diferi, comportamentul stream--%&/"%!%504.$!*2$/*6&7!F$!
$G$09/-!*2$/$*6&!"9$%*3&&!9"'!#&!#"/",&'$!9$.'%-!*!,2%&$!-.!0$,*H!9$!$2%*.!,*-!D.'%--.!#&6&$%7!<$%*%I&&/$!
($!2/*,$!2*%$!&09/$0$.'$*C5!D.!)*+*!,'%$*0-urile sunt definite în pachetul java.io.

5.1.2. Stream- !"#$%#&'(%)"#*"#+(!%,--uri de caractere

Stream--%&/$!9$!"2'$3&!Jbyte streams !"#$%5!"!0"(*/&'*'$!#*2&/5!($!*!2".'%"/*!&.'%5%&!6&!&$6&%&!($!"2'$3&1!


2*%$!9"'!#&!-'&/$!/*!2".'%"/*%$*!(*'$/"%!A&.*%$1!0*&!*/$,!*'-.2&!24.(!,$!/-2%$*C5!2-!#&6&$%$7!:2este
stream--%&!,-.'!&09/$0$.'*'$!9%&.!("-5!&$%*%I&&!($!2/*,$!2$!*-!/*!A*C5!("-5!2/*,$!*A,'%*2'$@!
InputStream 6&!OutputStream.

Stream-urile pe caractere (character streams 1!#"/",&'$!9$.'%-!2".'%"/-/!&$6&%&/"%!6&!&.'%5%&/"%!($!


caractere, folosesc coduri Un&2"($1!9-'4.(!#&!*,'#$/!#"/",&'$!*'-.2&!24.(!,$!("%$6'$!&.'$%.*3&".*/&C*%$*!
*9/&2*3&&/"%7!K.!0*%$!9*%'$1!#-.23&".*/&'*'$*!"#$%&'5!($!&$%*%I&*!($!2/*,$!2$!&09/$0$.'$*C5!,'%$*0-urile
9$!"2'$3&!$,'$!"L/&.(&'5!D.!2$*!"#$%&'5!($!&$%*%I&*!,'%$*0-urilor pe caract$%$7!:2$,'$*!(&.!-%051!,-.'!
bazate tot pe stream--%&/$!9$!"2'$3&1!#&&.(!2%$*'$!("*%!9$.'%-!*!"#$%&!-.!2".'%"/!0*&!#*2&/!*/!&.#"%0*3&&/"%!
bazate pe caractere. Stream--%&/$!9$!2*%*2'$%$!,-.'!&09/$0$.'*'$!9%&.!("-5!&$%*%I&&!($!2/*,$!2*%$!*-!/*!
A*C5!("-5!2/*,$ abstracte: Reader 6&!Writer.

5.1.3. Stream-uri predefinite

M"*'$!9%"L%*0$/$!)*+*!&09"%'5!*-'"0*'!9*2I$'-/!java.lang D.!2*%$!$,'$!($#&.&'5!2/*,*!System. Printre


*/'$/$1!*2$*,'5!2/*,5!2".3&.$!N!+*%&*A&/$!,'%$*0!9%$($#&.&'$@!in (InputStream), out (PrintStream), err
(PrintStream).

1
Paradigme de Programare
Laboratorul 5

)*$+,-./"%-0"#%$1 Descriere )*$+,-Character Descriere


BufferedInputStream <.'%*%$=&$6&%$! Stream
cu buffer BufferedReader Scriere/citire cu buffer
BufferedOutputStream
ByteArrayInputStream Scriere/citire BufferedWriter
în/dintr-un CharArrayReader Scriere/citire în/din array
ByteArrayOutputStrea *%%*B!($!"2'$3& de caractere
m CharArrayWriter
DataInputStream Scrierea/citire FileReader E2%&$%$=2&'&%$!D.=(&.!#&3&$%$
a tipurilor
DataOutputStream Java standard FilerWriter
FileInputStream Scriere/citire FilterReader Scriere/citire cu filtru
D.=(&.!#&6&$%$
FileOutputStream FilterWriter
FilterInputStream Scriere/citire InputStreamReader E'%$*0!($!&.'%*%$J&$6&%$ !
cu filtru 2$!2".+$%'$6'$!"2'$3&!D.!
FilterOutputStream OutputStreamWriter caractere (caractere în
ObjectInputStream Pentru "2'$3&
scriere/citire LineNumberReader Stream de intrare ce
ObjectOutputStream obiecte .-05%5!/&.&&/$
PipedInputStream PipedReader

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:

int read() throws IOException


int read(byte data[]) throws IOException
int read(byte data[], int start, int max) throws IOException

;%&0*!+*%&*.'5!*!0$'"($&!%$'-%.$*C5!-P!*'-.2&!24.(!$,'$!D.'4/.&'!,#4%6&'-/!,'%$*0-ului. Varianta a doua


,2%&$!"2'$3&&!2&'&3&!D.!*%%*B--/!(*'!94.5!24.(!*2$,'*!,$!-09/$!,*-!,$!*H-.L$ /*!,#4%6&'-/!,'%$*0-ului de
&.'%*%$7!Q$'-%.$*C5!.-05%-/!($!"2'$3&!2&'&3&!,*-!-1 atunci când stream--/!*!#",'!$9-&C*'7!:!'%$&*!+*%&*.'5!
,9$2&#&25!($!/*!2$!9"C&3&$!,$!,2%&$!D.!*%%*B!9%$2-0!6&!.-05%-/!0*G&0!($!+*/"%&!2$!+"%!#&!,2%&,$7

>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]);
}
}
}

>A,$%+50!25!&$6&%$*!/*!2".,"/5!,$!#*2$!2-!*H-'"%-/!0$'"($/"%!print() 6&!println() definite în clasa


PrintStream.

5.2.1. 1&2(!&/ /#3"*"%!%/&!

;$.'%-!/-2%-/!2-!#&6&$%$!#"/",&.(!,'%$*0--%&!9$!"2'$3&!,$!#"/",$,2!2/*,$/$!FileInputStream 6&!
FileOutputStream.

Crearea unui stream de citire dintr--.!#&6&$%!9%$,-9-.$!2%$*%$*!-.-&!"A&$2'!($!'&9-/!S&/$<.9-'E'%$*07!


O$/!0*&!#"/",&'!2".,'%-2'"%!$,'$!-%05'"%-/@

FileInputStream(String numeFisier) throws FileNotFoundException

O&'&%$*!"2'$3&/"%!(&.!#&6&$%!,$!9"*'$!#*2$!*9"&!#"/",&.( metoda read() 2*%$!2&'$6'$!24'$!-.!"2'$'!94.5!


24.(!*H-.L$!/*!,#4%6&'!6&!%$'-%.$*C5!+*/"*%$*!-1.

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();
}
}

În mod similar, scrierea într--.!#&6&$%!,$!9"*'$!#*2$!2-!*H-'"%-/!0$'"($&!write().

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);
}
}

5.2.3. 6''%+ /#,/%,(&!" #/,#'&2)"2 ( /#3"*"%!%/&!

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'"%-/@

RandomAccessFile (String fileName, String accessType) throws


FileNotFoundException

;$.'%-!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&$@

void seek(int pos) throws IOException

5.3. Fluxuri de caractere

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.

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

Pentru a citi caractere se pot folosi variantele metodei read() oferita de BufferedReder:

int read() thows IOException;


int read(char data[]) throws IOException;
int read(char data[], int start, int max) throws IOException;

5
Paradigme de Programare
Laboratorul 5

Pentru a citi string-uri se poate folosi metoda readLine().

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'"%-/@

PrintWriter(OutputStream outputStream, boolean flush)

;*%*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@

PrintWriter pw = new PrintWriter(System.out, true)

5.3.3. 1&2(!&/ /#3"*"%!%/&!

K.!L$.$%*/1!9$.'%-!*!/-2%*!2-!2*%*2'$%$!*,-9%*!#&6&$%$/"%!,$!#"/",$,2!2/*,$le FileReader 6&!FileWriter.

Cei mai comuni constructori ai clasei FileWriter:

FileWriter(String fileName) throws IOException


FileWriter(String fileName, boolean append) throws IOException

F*25!,$!("%$6'$!*(5-L*%$!($!'$G'!/*!2".3&.-'-/!-.-&!#&6&$%1!*'-.2&!parametrul append este true.

Exemplu de folosire a clasei FileWriter:

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,!%

Stream-urile 9$!"A&$2'$!J>AH$2'!E'%$*0, !,-9"%'5!"9$%*3&&!<=>!2-!"A&$2'$7!>A&$2'$/$!2*%$!9"'!#&!


#"/",&'$!D.!*,'#$/!($!"9$%*3&&!,-.'!"A&$2'$/$!*/$!25%"%!2/*,$!,-.'!0*%2*'$!2-!&.'$%#*3*!
Serializable. Se folosesc clasele ObjectInputStream 6&!ObjectOutputStream care
&09/$0$.'$*C5!&.'$%#$3$/$!ObjectInput 6&!ObjectOutput. Acestea la rândul lor sunt
,-A&.'$%#$3$!*/$!&.'$%#$3$/"%!DataInput 6&!DataOutput7!:2$*,'*!D.,$*0.5!25!0$'"($/$!
#"/",&'$!9$.'%-!,2%&$%$*!6&!2&'&%$*!'&9-%&/"%!9%&0&'&+$!,-.'!*22$,&A&/$!6&!(&.!*2$,'e clase.

Metodele folosite în cazul obiectelor sunt readObject() 6&!writeObject().

BigDecimal bigvalue = new BigDecimal(”123.45”);


...
ObjectOutputStream out = new ObjectOutputStream(new
BufferedOutputStream(new FileOutputStream(”fisier”)));
out.writeObject(bigValue);

ObjectInputStream in = new ObjectInputStream(new BufferedInputStrea(new
FileInputStream(”fisier”)));
BifDecimal bigValue = (BifDecimal) in.readObject();

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

O/*,$/$!2*%$!.-!&09/$0$.'$*C5!&.'$%#*3*!E$%&*/&C*A/$!nu vor putea fi de/serializate. <.'$%#*3*!


E$%&*/&C*A/$!.-!2".3&.$!.&2&!"!0$'"(*!6&!.&2&!-.!24091!,$%+&.(!("*%!/*!0*%2*%$*!#*9'-/-&!25!"!
2/*,5!9"*'$!#&!,$%&*/&C*'57!E-A'&9-%&/$!-.$&!2/*,$!,$%&*/&C*A&/$!,-.'!/*!%4.(-/!/"%!,$%&*/&C*A&/$7
;$.'%-!2*!"!9%"9%&$'*'$!,5!.-!#&$!&.2/-,5!D.!9%"2$,-/ de serializare, aceasta '%$A-&$!,5!#&$!
0*%2*'5!#"/",&.(!2-+4.'-/!transient. X*!($,$%&*/&C*%$1!9%"9%&$'53&/$!0*%2*'$!2-!'%*.,&$.'!,$!
&.&3&*/&C$*C5!2-!+*/"*%$*!/"%!&09/&2&'57!O-+4.'-/!'%*.,&$.'!,$!*9/&25!("*%!9%"p%&$'53&/"%1!.-!6&!
metodelor.

Clasele care ne2$,&'5!-.!2".'%"/!,9$2&*/!D.!'&09-/!($=,$%&*/&C5%&&!'%$A-&$!,5!&09/$0$.'$C$!


0$'"($/$!-%05'"*%$@

private void writeObject(ObjectOutputStream out) throws IOException

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

private void readObject(ObjectInputStream in) throws IOException

%$,9".,*A&/5!9$.'%-!2&'&%$*!,'5%&&!"A&$2'-/-&!6&!%$2".,'%-&%$*!*2$,'-&*.

7
Paradigme de Programare
Laboratorul 5

5.5. : '! /#' #3"*"%!%#;<=

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.

Clasa ZipFile are 3 constructori:

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.*;

public class ListZip {


public static void main(String args[]) {
for (int i=0, n=args.length; i<n; i++) {
String name = args[i];
try {
ZipFile zipfile = new ZipFile(name);
Enumeration enum = zipfile.entries();
while (enum.hasMoreElements()) {
ZipEntry entry = (ZipEntry)enum.nextElement();
System.out.println(
entry.getName() + " / " +
entry.getSize() + " / " +
entry.getCompressedSize()
);
}
} catch (IOException e) {
System.err.println("Error accessing: " + name);
}
}
}
}

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.*;

public class GetFile {


public static void main(String args[]) {
if (args.length != 3) {
System.err.println("Usage: java GetFile foo.zip name output");
}
String zipname = args[0];
String entryname = args[1];
String output = args[2];
System.out.println("Copying " + entryname + " from " +
zipname + " into " + output);
try {
ZipFile zipfile = new ZipFile(zipname);
ZipEntry entry = zipfile.getEntry(entryname);
InputStream is = zipfile.getInputStream(entry);
OutputStream os = new FileOutputStream(output);
byte array[] = new byte[512];
int length;
while ((length = is.read(array)) != -1) {
os.write(array, 0, length);
}
is.close();
os.close();
} catch (IOException e) {
System.err.println("Error copying: " + zipname);
}
}
}

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.

Exemplu de fi]&$%!D. format text:

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#/('/(
#!#"*%&#7(<+(/',#('&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&#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(.&@&#0#67(B$'&"/%&&'#(,0#=*&#();(,0/,#D#("10#)$*+D;,10(
#010&(-#(/"#),(.#'7(K()*="'/);(&4$10,/+,;(#),#(RuntimeException "/0#(0#$0#D&+,;(-&:#0)#(#010&(
"#($1,(/$;0#/('/(#!#"*%&#7

Sistemul de tratare /(#010&'10(-&+(9/:/(&4$'&";(.1'1)&0#/(/(L("*:&+,#("F#&#H(try, catch, throw, throws @&(


finally7(M'1"*'(-#("1-(41+&,10&D/,(3+(:#-#0#/($0&+-#0&&(@&(,0/,;0&&(#010&'10(#),#(3+"/-0/,(3+,0#("*:&+,#'#(
cheie try @&(catch7(N/";(1(#01/0#(/$/0#(3+(/"#),(='1"(-#("1-5(1 #!"#$%&#(#),#(?#+#0/,;(2O/0*+"/,;O(-
,F01G+67(B"#),#(#!"#$%&&()*+,($0&+)#(3+(='1"*0&'#("/,"F(@&(,0/,/,#(-*$;(-10&+%;7( !"#$%&&'#(?#+#0/,#(-#(
)&),#4()*+,(?#+#0/,#(@&(/0*+"/,#(/*,14/,7(P#+,0*(/(?#+#0/(4/+*/'(1(#!"#$%&#(3+(*04/(*+#&(),;0&($#("/0#(
1("1+)&-#0;4(#01+/,;5(.1'1)&4("*:A+,*'("F#&#(throw7(<+("/D*0&'#(3+("/0#(1(#!"#$%&#(#),#(?#+#0/,;(@&(+*(
#),#("/$,/,;(3+("10$*'(4#,1-#&("*0#+,#5(/,*+"&(4#,1-/(,0#=*&#();()$#"&.&"#(#!$'&"&,(";($1/,#(?#+#0/(1(
/+*4#(#!"#$%&#($0&+("*:A+,*'("F#&#(throws7(P10%&*+&'#(-#("1-("are trebuie executate obligatoriu
&+-&.#0#+,(-/";()#(?#+#0#/D;()/*(+*(1(#!"#$%&#(3+(='1"*'(,0Q-catch sunt încadrate într-un bloc finally.

4.1.1. Folosirea blocului try/catch

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

public class ExempluTryCatch {

public static void main(String[] args) {


int values[] = new int[10];
try {
System.out.println("Inainte de generare exceptie");

values[11] = 10; // index gresit


System.out.println("dupa generare executie. Nu se va executa!");
} catch (ArrayIndexOutOfBoundsException ex) {
System.out.println("prindere exceptie");
}
System.out.println("cod dupa bloc catch");
}
}

T#@&0#/(3+(*04/(#!#"*%&#&(#),#(*04;,1/0#/H

Inainte de generare exceptie


prindere exceptie
cod dupa bloc catch

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

Întregul cod cuprins într-*+(='1"("/,"F(#),#(41+&,10&D/,($#+,0*("/$,/0#/(#!"#$%&&'105(&+"'*)&:("1-*'(-&+(


metodele apelate din acest bloc try:

public class ExempluTryCatch {


public static void testMethod() {
int values[] = new int[10];
values[11] = 10; // index gresit
}

2
Paradigme de Programare
Laboratorul 4

public static void main(String[] args) {


try {
System.out.println("Inainte de generare exceptie");
testMethod();
System.out.println("dupa generare executie. Nu se va executa!");
} catch (ArrayIndexOutOfBoundsException ex) {
System.out.println("prindere exceptie");
}
System.out.println("cod dupa bloc catch");
}
}

Î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/,/,;(+&";&#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&,;(#!"#$%&#5("1+,#/D;($1,0&:&0#/ dintre
,&$*'(/"#),#&/(@&(,&$*'()$#"&.&"/,(-#(&+),0*"%&*+#/("/,"F7(B"#/),;($1,0&:&0#(%&+#("1+,(@&(-#(&#0/0F&/(-#(
"'/)#("#(0#$0#D&+,;(#!"#$%&&'#7(B),.#'5(1(&+),0*"%&*+#("/,"F("#()$#"&.&";(,&$*'(EF01G/='#(:/("/$,/(10&"#(
,&$(-#(#!"#$%&#7(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

public class ExempluSubclase {

public static void main(String[] args) {


int values[] = { 0, 1, 2 };
for (int i = 0; i <= 3; i++) {
try {
int nr = 10 / values[i];
System.out.println("rezultat : " + nr);
} catch (ArrayIndexOutOfBoundsException ex) {
System.out.println("exceptie : index gresit");
} catch (Throwable ex) {
System.out.println("o exceptie a aparut : " + ex.getMessage());
}
}
}
}

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

public class ExempluThrow {

public static void main(String[] args) {


try {
System.out.println("inainte de throw");
throw new Exception("exceptie generata manual");
} catch(Exception ex) {
System.out.println("exceptie : " + ex.getMessage());
}
}
}

!"#$%&/(?#+#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.

4.1.4. Clasa Throwable

Î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&#0#(/(#!"#$%&#&
toString(): 0#,*0+#/D;(*+(1=&#",(U,0&+?("#("1+%&+#(-#)"0&#0#/(#!"#$%&#&

4.1.5. Blocul Finally

B,*+"&("A+-()#(-10#@,#("/(/+*4&,#($10%&*+&(-#("1-();()#(#!#"*,#(&+-&.#0#+,(-/";(='1"*'(,0Q()-a executat
+104/'()/*(/(?#+#0/,(1(#!"#$%&#5(.1'1)&4(='1"*'(finally:

public class ExempluFinally {

public static void main(String[] args) {


int values[] = { 0, 1, 2 };
for (int i = 0; i <= 3; i++) {
try {
int nr = 10 / values[i];
System.out.println("rezultat : " + nr);
} catch (ArrayIndexOutOfBoundsException ex) {
System.out.println("exceptie : index gresit");
} catch (Throwable ex) {
System.out.println("o exceptie a aparut : " + ex.getMessage());
} finally {
System.out.println("finally bloc pt i = " + i);
}
}
}
}
4
Paradigme de Programare
Laboratorul 4

T#@&0#/(3+(*04/(0*';0&&(+#(/0/,;(";(='1"*'(.&+/''Q()#(#!#"*,;(&+-&.#0#+,(-#(41-*'(3+("/0#(='1"*'(,0Q(@&-a
,#04&+/,(#!#"*%&/7

4.1.6. Clauza throws

N/";(1(4#,1-;("1+%&+#("1-("#(/0($*,#/(?#+#0/(1(#!"#$%&#(@&(,1,*@&(3+("/-0*'(4#,1-#&(+*(#!&),;(*+(='1"(
,0QR"/,"F("/0#();($0&+-;(/"#/(#!"#$%&#5(/,*+"&(/"#/(4#,1-;(,0#=*&#();()$#"&.&"#($0&+("'/*D/(throws ";(
$1/,#(?#+#0/(/"#/(#!"#$%&#7(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;

public class TestThrows {

public static char testMethod() throws IOException {


System.out.println("introiduceti un caracter");
return (char) System.in.read();
}

public static void main(String[] args) {


try {
char ch;
ch = testMethod();
System.out.println("ch : " + ch);
} catch (IOException e) {
e.printStackTrace();
}
}
}

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&#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;

public class Container {

private Object element;

public void setElement(Object element) {


this.element = element;
}

public Object getElement() {


return element;
}
}

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;

public class ContainerTest {

public static void main(String[] args) {

Container container = new Container();


container.setElement(10);

int val =(Integer) container.getElement();


System.out.println("value : " + val);
}
}

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

Exception in thread "main" java.lang.ClassCastException: java.lang.String


cannot be cast to java.lang.Integer
at work.ContainerTest.main(ContainerTest.java:10)

4.2.1. Tipuri generice

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*(
'/(&+),/+%&#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;

public class Container<T> {

private T element;

public void setElement(T element) {


this.element = element;
}

public T getElement() {
return element;
}
}

81'1)&0#/("'/)#&()#(41-&.&";($0&+(/-;*?/0#/(,&$*'*&(-10&,("/($/0/4#,0*7(Folosirea unui tip generic se


4/&(+*4#@,#(@&(&+:1"/0#(/(*+*&(,&$($/0/4#,0&D/,7

7
Paradigme de Programare
Laboratorul 4
Container<Integer> container = new Container<Integer>();

B$'&"/%&/(-#(,#),(/(,&$*'*&()#(41-&.&";(/),.#'H

package work;

public class ContainerTest {

public static void main(String[] args) {

Container<Integer> container = new Container<Integer>();


container.setElement(10);

int val = container.getElement();


System.out.println("value : " + val);
}
}

K=)#0:;4(";('/(#!,0/?#0#/(#'#4#+,*'*&(+*(4/&(#),#(+#"#)/0;(+&"&(1("1+:#0)&#5(-#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+:#+%&#5($/0/4#,0&&(-#(,&$()#(
numesc începând cu litera T (Type).

4.2.2. Metode generice

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;

public class GenericMethod {

public static <U> void testMethod(U u) {


System.out.println(u.getClass().getName());
}

public static void main(String[] args) {


GenericMethod.<String>testMethod("test");
GenericMethod.testMethod(10);
}
8
Paradigme de Programare
Laboratorul 4
}

!"#$%#&'("$)#&("*+'%,"-%.%#"+!"%/%,*)+".% ,%'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;

public class Container<T extends Number> {

private T element;

public void setElement(T element) {


this.element = element;
}

public T getElement() {
return element;
}
}

!"#*)3$#?3#".%"'%&'"putem folosi acum numai tipuri numerice:

package work;

public class ContainerTest {

public static void main(String[] args) {

Container<Integer> intContainer = new Container<Integer>();


intContainer.setElement(10);
int intVal = intContainer.getElement();
System.out.println("int value : " + intVal);

Container<Float> floatContainer = new Container<Float>();


floatContainer.setElement(10.5f);
float floatVal = floatContainer.getElement();
System.out.println("float value : " + floatVal);
}
}

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

Exception in thread "main" java.lang.Error: Unresolved compilation


problems:
Bound mismatch: The type String is not a valid substitute for the
bounded parameter <T extends Number> of the type Container<T>

4.2.4. !.*'%%.!+0)#$!+#%,1$%.!+2!)!$%&!

!"$#<+)"$)#&%)02"063@!+3'%"%/3&'("0"2%)#?3%";!'2%"$)#&%)%".%"6#<("@3"clasele care le extind. În exemplul


#!'%2302"#,"70)0&3'"$)#&#"I!'%1%2"$#2%"%/'3!.%"F+,6%24"=+'%,"&*+!%"$("I!'%1%2"%&'%"+!"F+,6%2"@3"
023+!.%"'2%6+3%"&("07%23,"0"3!&'#!?(".%"'3*+)"F+,6%2"*+'%,"07%23"+!"063%$'"I!'%1%2"$+"&+$$%&4"E+"#)'%"
$+-3!'%"0"&+6$)#&("&*%$3#)3<%#<("$)#&#"&#".%"6#<(".#2"*0#'%"73"70)0&3'(")#"!%-03%".0#2"$#"0"3!&'#!?("#"
$)#&%3".%"6#<(4

!"$#<+)"'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.

D#$("E0!'#3!%2JI!'%1%2K"@3"E0!tainer<Float> nu sunt subtipuri ale tipului Container<Number>,


%/3&'("'0'+@3"+!",0.".%"#"2%7%2%!?3#"$%)%".0+("'3*+23"*rintr-0"&3!1+2("-#23#63)(H

Container<? extends Number> someContainer;


someContainer = intContainer;
someContainer = floatContainer;

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(.!&'%%

Denumirea de Collection sau Container &%"2%7%2(";!"1%!%2#)")#"+!"&3,*)+"063%$'"$#2%"12+*%#<(",#3"


,+)'%"%)%,%!'%"@3"$#2%"#O+'(")#"&#)-#2%#8",#!3*+)#2%#"@3"'2#!&,3'%2%#"#$%)+3"12+*".%"%)%,%!'%4"
F%$%&3'#'%#")+$2+)+3"$+"$0)%$?33".%".#'%"%&'%".%&";!'>)!3'(";!"*2012#,#2%#"#*)3$#?33)028"7#*'"*%!'2+"$#2%"
)3,6#O+)"P#-#"07%2("0"#2C3'%$'+2("$0,+!(".%"2%*2%<%!'#2%"@3",#!3*+)#2%"#"$0)%$?33)02".%".#'%4"A$%#&'("
#2C3'%$'+2("&%"!+,%@'%"collection framework4"Q!"#&'7%)".%"72#,%N02R"'2%6+3%"&("$0!?3!(";!"1%!%2#)"
+2,('0#2%)%"*#2?3H

!"#$%#&#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

Figura 4-1- #$,$-+,.+!"#$%#&#)/$.0+!.1/))#2"+/!.3$,'#4/$5

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&#2%#"-#)023)02"
dintr-0"$0)%$?3%"&#+".3!'2-un array:

for (Object elem : collection) {


!"#$%&'&()*!&+&,&-./+!%/#&-.
}

Q!"3'%2#'02"%&'%"+!"063%$'"$%"3,*)%,%!'%#<(",%'0.%)%"3!'%27%?%3"Iterator: hasNext, next @3"remove.


11
Paradigme de Programare
Laboratorul 4

Lucrul cu grupuri întregi de valori: containsAll, addAll, removeAll, retainAll, clear.

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

L*%2#?33)%".%"6#<(H"add @3"offer :#.#+1("+!"%)%,%!'8";!"$#<".%".%*(@32% #"$#*#$3'(?33"*23,#",%'0.("


1%!%2%#<("0"%/$%*?3%"3#2"#".0+#"2%'+2!%#<("7#)&%98"remove @3"poll :@'%21"@3"2%'+2!%<(".3!"$0#.("*23,+)"
%)%,%!'8";!"$#<"$("!+"%/3&'("!3$3"+!"%)%,%!'8"*23,#",%'0.("1%!%2%#<("0"%/$%*?3%"3#2"#".0+#"2%'+2!%#<("
null), element @3"peek :#$?30!%#<(")#"7%)"$#"*2%$%.%!'%)%"0*%2#?33"7(2("&("@'%#21("%)%,%!'+)".3!"$0#.(94

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.

Map: un obiect $#2%",#*%#<("$C%3"@3"-#)0234"F+"*0#'%"$0!?3!%"$C%3".+*)3$#'%4

L*%2#?33)%".%"6#<(H"T"put(K key, V value), V get(Object key), V remove(Object key), containsKey,


containsValue.

Q!"U#*"*0#'%"73"700)0&3'"$#"0"$0)%$?3%"*23!"$0)%$?33"*%"$#2%")"07%2(H"keySet, values, entrySet. Cheile


733!."+!3$%8"06&%2-(,"$("*23,#"@3"+)'3,#"$0)%$?3%"&+!'"G%'-+234"I!'%27#?#"V!'2W".%73!3'(";!"$#.2+)"
3!'%27%?%3"U#*"07%2("+2,('0#2%)%",%'0.%H"getKey, getValue, setValue.

4.3.2. 4-,.!-!)#6$%.!+(5!$%#!

I#'("+!"'#6%)"$+"3,*)%,%!'(23)%"$+"&$0*"1%!eral oferite în Framework Collection8"$>'"@3"'3*+)".%"


implementare:

!"#$%&'( Hash Table Array Arbore 6+7"*. Hash table cu


redimensionabil ;!)*!&<+"* )+7"*.;!)*'&<+"*
Set HashSet TreeSet LinkedHashSet
List ArrayList LinkedList
Map HashMap TreeMap LinkedHashMap

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.

Pentru a putea folosi stiva cu diverse *"6'$"!%)!&8").*) !:&,&1"7"!C+!"36,)3)+*#$)#!"+*)$:)7)"!;"!#!


clasei tipurile generice.

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.

8/&(7(%43.&'(&'!"#$"%1&'(&)*!(+,(&4(/,$.&'!"#$"%"&'(&+3"-(&'!/&Figura 3-1 - Diagrama de clase este


4$(9(/,",1&:/ Figura 3-2 - Diagrama de obiecte.

Figura 3-1 - Diagrama de clase

Figura 3-2 - Diagrama de obiecte

1
Paradigme de Programare
Laboratorul 3

3.2. Diagrama de clase în Eclipse


;(/,$.&"&+$("&)&'!"#$"%1&'(&+3"-(&:/&<+3!4-(&-(&-(3(+,("91&3)+"0!"&./'(&-(&')$(6,(&+$("$("&'!"#$"%(!=&
iar din meniu se alege File -> New -> Other… 6!&-(&-(3(+,("91&Class Diagram de la UML 2.1
Diagrams '.41&+"$(&-(&"3(#(&/.%(3(&'!"#$"%(!>

Figura 3-3 - Fereastra de creare a diagramei de clase

<3(%(/,(3(&'!"#$"%(!&'(&+3"-(&-(&#1-(-+&:/&4"/).3&Palette '!/&4"$,("&'$("4,1> Pentru a edita o


+)%4)/(/,&"&'!"#$"%(!&?+3"-1=&",$!*.,=&)4($"0!(&-".&$(3"0!(@&-(&4)",(&.,!3!9a 4"/).3&Properties din
4"$,("&'(&A)->

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

Figura 3-5 - Diagrama de clase - Exemplu

Figura 3-4 - Panoul Palette

3
Paradigme de Programare
Laboratorul 3

Figura 3-6 - Panoul Properties

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

;3"+"&'(&*"91: ,!4&?JLM=&%JLM=&JL@=&EPU socket ?NNH@=&,!4&? OP@&6!&/.%1$&'(&%(%)$!!&


-.4)$,",(=&/.%1$&'(&-3),.$!&;EQ=&,!4&-3),&5!'()&?;EQ&<74$(--@>
ProcesorC&2$(+5(/01&4$)+(-)$&?PHII&RS9@=&E;8&-)+T(,&?NHH@=&BKU&?VWWW RS9@=&%)'&'(&
)4($"$(&?XY&*!,!@ 6!&'"+1 are cooler sau nu.
R(%)$!(C&,!4&%(%)$!(&? OP@=&-,"/'"$'&?;E-XYII@=&+"4"+!,",(&?VIPY&RU@=&2$(+5(/0"&?ZII&
RS9@>
S"$'& !-TC&5!,(91&'(&$),"0!(&?NPII&$4%@=&+"4"+!,",(&?HII&FU@=&'!%(/-!./(&*.22($&?WP&RU@=&
!/,($2"01&?KJLJ&P@>
E"3+.3",)$: 43"+1&'(&*"91=&4$)+(-)$=&%(%)$!(&6!&["$'&'!-T.

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:

!"#$%"&$'pe hârtie ()*+,"-!#!'.$"/-")! UML:


o !"#$"%1&.-(-case
o !"#$"%1&'(&"+,!5!,",(>
o !"#$"%1&'(&-,"$(>
o !"#$"%1&'(&-(+5(/01>
o !"#$"%1&'(&+)3"*)$"$(>
o !"#$"%1&'(&)*!(+,(>
!"#$%"&$'în Eclipse diagrama de clase.

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#)*#&,(*'&@**( #/&<&#0 /&#'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.

G1*' #*+,( + %"&1 #'2+,( "5#0 #,(&"421+5#A&<&#"1 .-* #!5#24 1 #-1+5"2&1 ( H

Tool-uri de dezvoltare: principalele sunt javac, java )*#javadoc.


API-ulH#24 15#4-%'@*2%&(*"&" &#0 #.&F5#&#(*+.&/-(-*#0 #,1231&+&1 #,1 '-+#)*#2#&1* #
(&135#0 #'2+,2% %" #3&"&#0 #42(2!*"H#Java SE 6 doc.
Tehnologii de deployment: mecanisme precum Java Web Start sau Java Plug-In.
Kit- !"#$%&'! #(!%)!%)#"&'%!*%+%,-!# '",".)'-!: AWT, Swing, Java 2D.

2.1.2. Variabile
P%#A&<&# :*!"5#-1+5"2&1 ( #"*,-1*#0 #<&1*&.*( H

/)!")0",%#1%#"&2')&+36#M-%"#-%*' #4* '51 *#*%!"&%@ #( #'(&! *6


/)!")0",%#1%#(,)236#G#!*%3-15#'2,* #, %"1-#"2&" #*%!"&%@ ( #'(&! *6#M #42(2! )" #modificatorul
de acces „static”.

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

Tipuri de date primitive

Tipul de Reprezentare /),-)!%#6"&"63 /),-)!%#6)7"63 Valoare


date default

byte Z#.*@* -128 127 0

short [\#.*@* -32,768 32,767 0

int ]^#.*@* -2,147,483,648 2,147,483,647 0

long \_#.*@* -9,223,372,036,854,775,808 9,223,372,036,854,775,807 0L

float ]^#.*@* 0.0f

double \_#.*@* 0.0d

boolean false

char [\#.*@* ‘\u0000’ ‘\uffff’ ‘\u0000’

B&(21*( #0 4&-("#! #&,(*'5#$%#'&F-(#<&1*&.*( (21#+ +.1 #0 #'(&!56#B&1*&.*( ( #(2'&( #%-#!-%"#*%*@*&(*F&" #


*+,(*'*"#0 #'2+,*(&"21#)*#"1 .-* #*%*@*&(*F&" #0 #'5"1 #,1231&+&"21#$%&*%" #0 #&#4*#&'' !&" 6

O %"1-#(-'1-(#'-#)*1-1*( #0 #'&1&'" 1 #! #42(2! )" #'(&!&#!, '*&(5#java.lang.String. Obiectele String în


Java sunt „immutable=H#20&"5#'1 &" 7#<&(2&1 &#(21#%-#+&*#,2&" #4*#+20*4*'&"5#,1*%#%*'*#-%#4 (#0 #
2, 1&@**6#B&(2&1 &#0 4&-("#, %"1-#2.* '" ( #M"1*%3# !"e null, la fel ca pentru orice alt obiect.

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};

M #,2"#42(2!*#)*#< '"21*#+-("*0*+ %!*2%&(*H


int[][] matrix = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};

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)

int[] arrayFrom = {1, 2, 3, 4, 5, 6};


int[] arrayTo = new int[4];
arraycopy(copyFrom, 0, arrayTo, 0, 4);

2.1.3. Operatori
G, 1&"21**#!-%"#!*+.2(-1*#!, '*&( #'&1 # : '-"5#2, 1&@**#!, '*4*' #&!-,1&#-%-*#%-+51#0 #[7#^#!&-#]#
operanzi.

a&. (-(#-1+5"21#,1 F*%"5#2, 1&"21**#)*#$!"-!"'3+",% (216#O1*21*"5@*( #!'&0#0 #!-!#$%#/2!7#*&1#2, 1&"21**#


&4(&@*#, #&' &)*#(*%* #&-#&' &)*#,1ioritate.

Nume operator Simbol


postfix expr++ expr--
unar ++expr –expr +expr –expr ~ !
multiplicativ */%
aditiv +-
shift << >> >>>
1 (&@*2%&( < > <= >= instanceof
de egalitate == !=
>Tb#, #.*@* &
cGX#, #.*@* ^
GX#, #.*@* |
AND &&
OR ||
ternar ?:
Atribuire = += -= *= /= %= &= ^= |= <<= >>= >>>=

1) !"#$%&#'()*")$%#+,'+#")-+.!(/
int number = 0;
char ch = ‘A’;
String s = “a string”;

2) Operatori aritmetici
+, - !" !#!$%&'()*+),!%-.),/0(1 !2!$),3.45!%&'()*+)++1

O2"#4*#42(2!*@*#(&#'1 &1 &#atribuirilor compuse:


+=, -=, *=, /=, %=

3
Paradigme de Programare
Laboratorul 2

G, 1&"21-(#d#,2&" #4*#42(2!*"#)*#, %"1-#'2%'&" %&1 &#!"1*%3-urilor.

3) Operatori unari
+, -, ++, --, !(complementar logic)

G, 1&"21**#,1 4*:#)*#,2!"4*:#dd7#-- &-# 4 '"#&' (&)*# 4 '"#&!-,1&#<&1*&.*( *7#0&1# <&(- &F5#expresia în


+20#0*4 1*"7#0-,5#'-+#!-3 1 &F5#)*#0 %-+*1 &6

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.

6) Operatorul de comparare a tipului


instanceof

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

E"&3B-50&*!"1$"*>&6*%&1,-$&#%& !"#$%&' %! (,)(,)&-.$.' ) #%& !"#$%&' %! (&/!#$/-.

int nr = 10; ==2%>4(&(-"%

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
}

Recomandare: chiar 4*!0&*7"6&-"7'%"&4"&'&1%-5,)0&%-1$),!.%,-"&=-&:3'!,3&%+-$L"->&"1$"&()"+")*:%3&10&1"&


+'3'1"*1!0&$'$,#%&*!'3*4"3">&("-$),&*&"7%$*&"7"-$,*3"3"&:,5-,)%&*$,-!%&!B-4&"1$"&-"!"1*)0&*40,5*)"*&4"&
-'%&%-1$),!.%,-%;

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

int[] nrs = {1, 2, …, 10};


for (int number : nrs) {
"#'5&?>-"?#"A
}
8)%,-4"&1"&('*$"&+'3'1%>&*&4',*&7*)%*-$0&*&%-1$),!.%,-%%&+')&"1$"&!"*&)"!'6*-4*$0;

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

class MyClass extends BaseClass implements InterfaceOne, InterfaceTwo {


//...
}
=)+*")-)!)*+")+-*(+5,#+*3.%F*+;(+-,3(8(&*#,$(+3)+*&&)"2+&%-+*$+8(+public sau private.

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

Denumirile câmpurilor se înca3$)*A.+C!+$)&,-*!3.$(1)+3)"5$)+!%-)1)+?*$(*0(1)1,$+3(!+"%0&*5(#,1%1+


anterior.

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.

Signatura unei metode &%5$(!3)+!%-)1)+;(+1("#*+3)+5*$*-)#$(6+J)#,3)1)+3)&1*$*#)+(!#$-,+&1*".+#$)0%()+


".+*(0.+"(F!*#%$(+3(8)$(#)6+7)+,0")$?.+&*+#(5%1+$)#%$!+!%+5,*#)+3(8)$)!'(*+3,%.+-)#,3)+&*$)+*$)+$)"#%1+
elementelor identice.

Metodele pot fi +%.012" )0 1#&: mai -%1#)+-)#,3)+5,#+*?)*+*&)1*;(+!%-)+*#4#+#(-5+&4#+"(F!*#%$(1)+1,$+


"%!#+3(8)$(#)2+*3(&.+1("#)1)+3)+5*$*-)#$(+"%!#+3(8)$(#)6+B&)"#)+1("#)+5,#+3(8)$(+5$(!+!%-.$%1+;(+5$(!+#(5%1+
parametrilor.

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.

Se poate trimite unei metode un "%6)0'510$14$*',&'.1016&#0$6+B&)*"#.+#):!(&.+)"#)+5,"(0(1.+5$(!+


8,1,"($)*+%!)(+&,!"#$%&'((+!%-(#.+varargs ;(+5,*#)+8(+%#(1.+*#%!&(+&4!3+!%+")+;#()+&)+!%-.$+3)+
*$F%-)!#)+3)+%!+*!%-(#+#(5+?,$+8(+#$(-(;(+-)#,3)(+1*+*5)16

public int addNumbers (int... numbers) {


,0)%$&''
}

J)#,3*+5,*#)+8(+*5)1*#.+&%+,$(&)+!%-.$+3)+5*$*-)#$(+"*%+&:(*$+&%+!(&(+%!%16+R! interiorul metodei


5*$*-)#$%1+)"#)+?.A%#+&*+%!+*$$*T2+(*$+-)#,3*+5,*#)+8(+*5)1*#.+&%+%!+?)&#,$+"*%+&%+,+")&?)!'.+3)+
argumente.

Numele parametrilor 3)&1*$*'(+C!+-)#,3)+#$)0%()+".+8()+3(8)$(#)+C!#$)+)1)+;(+!%+5,#+&,(!&(3)+&%+!%-)1)+


variabilelor locale decla$*#)+C!+-)#,3.6+U!+5*$*-)#$%+5,*#)+*?)*+C!".+*&)1*;(+!%-)+&%+%!+&4-5+*1+
clasei, câmp care va fi ascuns C!+&,$5%1+-)#,3)(6+B"#8)1+3)+#):!(&(+5,#+3%&)+1*+&,!8%A((+;(+"%!#+8,1,"(#)+
3)+$)F%1.+3,*$+C!+&*A%1+-)#,3)1,$+&*$)+")#)*A.+%!+*!%-(#+&4-56+V*$(*0(1*+-)-0$.+*+&1*")(+5,*#)+8(+
*&&)"*#.+C!+*&)"#+&*A+3,*$+3*&.+)"#)+&*1(8(&*#.6
8
Paradigme de Programare
Laboratorul 2
...
private int dim;
pubic void setDim(int fdim) {
this.dim = dim;
}

7)+,0")$?.+8,1,"($)*+&%?4!#%1%(+&:)()+this6+B&)"#*+)"#)+,+$)8)$(!'.+&.#$)+,0()&#%1+&%$)!#2+,0()&#%1+*+
&.$%(+(!"#*!'.+*+8,"#+8,1,"(#.+5)!#$%+*5)1*$)*+-)#,3)(6+

Argumentele de tip primitiv sunt trimise la apel prin valoare6+B&)*"#*+C!")*-!.+&.+,$(&)+-,3(8(&.$(+


aduse argumentelor în cazul metodei nu vor afecta variabila trimisa la apelul metodei. Argumentele de
#(5+$)8)$(!'.+"%!#+#$(-(")+3)+*")-)!)*+1*+*5)1+5$(!+?*1,*$)6+B"#*+C!")*-!.+&.+?*$(*0(1*+8,1,"(#.+&*+
*$F%-)!#+1*+*5)1%1+-)#,3)(+?*+$)8)$(+*&)1*;(+,0()&#+3%5.+#)$-(!*$)*+)/)&%'()(+-)#,3)(2+&:(*$+3*&.+C!+
cadrul acesteia i s-*$+8(+*#$(0%(#+5*$*-)#$%1%(+$)"5)&#(?+,+$)8)$(!'.+1*+%!+*1#+,0()&#6+@,#%;(2+-)#,3*+
*5)1*#.+5,*#)+*3%&)+-,3(8(&.$(+,0()&#%1%(+$)8)$(#+8()+5$(!+*5)1%1+%!,$+-)#,3)+8()+3($)&#+5$(!+-,3(8(&*$)*+
&4-5%$(1,$2+3*&.+*&)"#)+"%!#+*&&)"(0(1).

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

public MyClass (int param1, int param2) {


'-.+%/"&'/-'
}

Regulile 3)+"%5$*C!&.$&*$)+*+-)#,3)1,$+")+*51(&.+;(+C!+&*A%1+&,!"#$%&#,$(1,$2+5%#4!3%-se astfel declara


-*(+-%1'(+&,!"#$%&#,$(2+&%+&,!3('(*+&*+1("#)1)+1,$+3)+5*$*-)#$(+".+8()+3(8)$(#)6

L4!3+")+3)&1*$.+-*(+-%1'(+&,!"#$%&#,$(+;(+")+3,$);#)+*5)1*$)*+%!%(*+3(!+&*3$%1+&eluilalt se poate folosi


cuvântul cheie this6+B5)1%1+&.#$)+%!+*1#+&,!"#$%&#,$+#$)0%()+".+8()+5$(-*+(!"#$%&'(%!)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

W+&1*". poate avea modificatorul public ;(+5,*#)+8(+?(A(0(1.+3(!+#,*#)+&1*")1)2+"*%+5,*#)+".+!%+*(0.+!(&(+


%!+-,3(8(&*#,$+"5)&(8(&*#2+&))*+&)+")+!%-);#)+package-privateD+?(A(0(1.+3,*$+C!+&*3$%1+5*&:)#%1%(+3(!+
care face parte.

Pentru membrii claselor se pot folosi *&)(*;(+-,3(8(&*#,$(+&*+1*+&1*")2+*?4!3+*&)1)*;(+")-!(8(&*'((6+R!+


plus se mai pot folosi modificatorii private H-)-0$((+5,#+8(+*&&)"*'(+3,*$+3(!+(!#)$(,$%1+&1*")(I+;(+
protected H-)-0$((+5,#+8(+*&&)"*'(+3(!+*&)1*;(+5*&:)#+"*%+3(!+&1*")1)+&*$)+3)$(?)*A.+&1*"*+;(+")+*81.+C!+
alte pachete).

U$-.$('(+C!+#*0)1%1+%$-.#,$+*&&)"(0(1(#*#)*+,8)$(#.+3)+8()&*$)+-,3(8(&*#,$D

Modificator Clasa Pachet 7%4 *1+) Oriunde

(în alt pachet) (în afara pachetului)


public Da Da Da Da
protected Da Da Da -
package-private Da Da - -
private Da - - -
7)+$)&,-*!3.+8,1,"($)*+%!%(+*&&)"+&4#+-*(+$)"#$(&#(?+5,"(0(1+*#%!&(+&4!3+")+&,!&)5)+"#$%&#%$*+&1*")1,$6+
X,1,"($)*+-,3(8(&*#,$(1,$+-*(+5%'(!+$)"#$(&#(?(+8.$.+%!+-,#(?+*!%-)+#(!3)+)?,1%'(*+*51(&*'()(+1*+,+
(-51)-)!#*$)+5*$#(&%1*$.+;(+-*(+5%'(!+81)/(0(1.2+&))*+&)+C!F$)%!)*A.+-,3(8(&.$(1)+%1#)$(,*$)+*"%5$*+
codului.

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$%)
}

Pot fi oricâte blocuri statice într-,+&1*".+;(+")+5,#+*81*+,$(%!3)+C!+&,$5%1+&1*")(6+Y*+)/)&%'()+?,$+$%1*#)+C!+


,$3(!)*+C!+&*$)+*5*$+C!+&,3%1+"%$".6+

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

9*! %0$',&'$"$/$1*$810& 5,#+8(+8,1,"(#)+;(+5)!#$%+-)-0$((+3)+(!"#*!'.6+B&)"#)+01,&%$(+"%!#+&,5(*#)+3)+


&.#$)+&,-5(1*#,$+C!+8()&*$)+&,!"#$%&#,$2+8((!3+,+-,3*1(#*#)+8*&(1.+3)+*+8,1,"(+&,3+&,-%!+5)!#$%+#,'(+
constructorii.

{
",!('-'&'$#'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

private int nr = initInstanceNr();


protected final int initInstanceNr() {
",!('-'&'$#'1$%)
}

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()&#2+
*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

int x1 = new line(point1, point2).x1;

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

static final double PI = 3,141592;

W+C!&)$&*$)+3)+*+*#$(0%(+*1#.+valoare unei variabile constante s-ar solda cu o eroare de compilare.

<$(!+&,!?)!'()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

public interface BigInterface extends Interface1, Interface2 {


//constante
double PI = ...;
//signaturi de metode
double doAction();
}
D&"/(".'&,$'$9"(!)$%*$+$'$"81)"&7$&"21:(*(.&)1%((":$"&..$,"8-;'(.",&-"8&.E&#$-private.

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

2.1.9. Clase imbricate


În Java se pot defini clase în interiorul altor clase. Acestea se numesc clase imbricate (nested
classes).

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:

ExternClass.InternClass obj = new ExternClass.InternClass();

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

ExternClass.InnerClass obj = externObject.new InnerClass();

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

Tip Scop /+*,(+#


) !"#$%&'(%)!*#$"*!*%)# membru NU
) !"#$%+*,(+# <!$,)&)(.3> membru Da
) !"#$ 0)! # local Da
) !"#$!+0+%&# 4!"8-!.)-'":$":$*(!(+($ Da

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

În orice package s-&%"&*'&9".'&,&":$%(7&)3"21/)$!$/)$")1+("2$2;%(("8-;'(."/("8%1)$.)$:":(!".'&,&":$";&A35"


C&.3",$"&*'3"4!"&.$'&/("8&.H$)9"21/)$!$/)$"/("2$2;%(("8&.E&#$-private.

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

Se pot de asemenea :$.'&%&".G28-%(".-"&.$'&/("!-2$9".&%$"71%"ascunde .G28-%('$":(!".'&,&":$";&A3"


<8%&.)(.3"!$%$.12&!:&)3>5"L.$,)$".G28-%("81)"&7$&")(8-%(":(*$%()$"*&+3":$")(8-%('$".G28-%('1%"&,.-!,$"
:(!".'&,&":$";&A35"L..$,-'"'&".G28-'"&,.-!,":(!".'&,&":$";&A3",$"81&)$"*&.$"prin calificare cu cuvântul
cheie super. @$"'G!#3".$'$"21/)$!()$9",$"81)":$.'&%&"/("!1(".G28-%(5

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.

Un )0+"*(4)*0($1%+$) !"!$1,$'!3# poate fi apelat dintr--!".1!,)%-.)1%":(!".'&,&":$%(7&)3"8%(!".-7G!)-'"


cheie super5"?!71.&%$&".1!,)%-.)1%-'-(":$";&A3"8%(!",-8$%")%$;-($",3"*($"8%(2&"(!,)%-.+(-!$":(!"
.1!,)%-.)1%-'".-%$!)5"C&.3"!-"$,)$ .H$2&)"$=8'(.()"-!".1!,)%-.)1%":(!".'&,&":$";&A39".128('&)1%-'"
(!,$%$&A3"(28'(.()"-!"&8$'"'&".1!,)%-.)1%-'"*3%3"&%#-2$!)$5"C&.3".'&,&":$";&A3"!-"&%$"-!".1!,)%-.)1%"
*3%3"8&%&2$)%(9"&)-!.("712"&7$&"1"$%1&%$"'&".128('&%$5"I$"1;,$%73"&,)*$'".3",$".%$$&A3"-!"'&!+":$"
&8$'-%(":$".1!,)%-.)1%("8G!3"'&".1!,)%-.)1%-'"*3%3"&%#-2$!)$":(!".'&,&"J;B$.)"<constructor chaining).

3) Clasa Object
D'&,&"J;B$.)",$"&*'3"4!"7G%*-'"($%&%H($(":$".'&,$"(&%"1%(.$"&')3".'&,3"$,)$":$,.$!:$!)3":(%$.)3",&-"
(!:(%$.)3"&".'&,$("J;B$.)"/("21/)$!$/)$"2$)1:$'$",&'$":$"(!,)&!+35

public final void notify();


public final void notifyAll();
public final void wait();
public final void wait(long timeout);
public final void wait(long timeout, int nanos);

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.

protected Object clone() throws CloneNotSupportedException

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.

public int hashCode()

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

public boolean equals(Object obj)

?!:(.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

public final Class getClass()

L.$&,)3"2$)1:3"!-"81&)$"*(",-8%&,.%(,35"N&"%$)-%!$&A3"-!"1;($.)":$")(8"java.lang.Class prin care se


81)"1;+(!$":(7$%,$"(!*1%2&+((":$,8%$"1;($.)-'".-%$!)5"@%(!)%$"2$)1:$'$"-)('$"1*$%()$":$ clasa Class sunt:
#$)I(28'$U&2$<>"<!-2$'$".'&,$(>9"#$)I-8$%D'&,,<>"<.'&,&":$";&A3>9"#$)(!)$%*&.$,<>"<(!)$%*$+$'$"
implementate), isAnnotation(), isInterface(), isEnum(), getFields(), getMethods().

public String toString()

S$)-%!$&A3"1"%$8%$A$!)&%$"4!"*1%2&)")$=)"&"1;($.)-'-(5"N,)$"%$.12&!:&)3",-8%&,.%($%$&"&.$,)$("2$)1:$"
în toate clasele.

protected void finalize()

Metoda finalize poate *("(!71.&)3"&)-!.(".G!:"1;($.)-'"$,)$".1'$.)&)":$".3)%$"V&%;&#$"D1''$.)1%5"


Implementarea din Object nu face nimic, iar o $7$!)-&'3",-8%&4!.3%.&%$"&%"8-)$&"*("*1'1,()3"8$!)%-"
$'(;$%&%$&"-!1%"%$,-%,$5"Q12$!)-'"&8$'-'-("2$)1:$("!-"81&)$"*(".-!1,.-)".-",(#-%&!+39"!(.("!-",$"81&)$"
/)("$=&.)":&.3"2$)1:&"7&"*("&8$'&)39"21)(7"8$!)%-".&%$"$'(;$%&%$&"-!1%"%$,-%,$"!-"81&)$"*("'3,&)3"4! baza
&.$,)$("2$)1:$".(")%$;-($"*3.-)3"4!"21:"$=8'(.()5

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".'&,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

M&+3":$"(!)$%*$+$9".'&,$'$"&;,)%&.)$"81)".1!+(!$".G28-%(".&%$"!-",-!)"public static final /("81)"&7$&"


2$)1:$"(28'$2$!)&)$5"C&.3"1".'&,3"&;,)%&.)3"!-".1!+(!$"!(.("-!"&,)*$'":$"$'$2$!)9"&)-!.("&%")%$;-("
:$.'&%&)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

Object obj = new MyObject();

D1!7$%)(%$&".&%$"&%$"'1."'&"1"&,)*$'":$"&)%(;-(%$"$,)$"1".1!7$%)(%$"(28'(.()3"<implicit casting).

MyObject myObj = obj;

J"&,)*$'":$"(!,)%-.+(-!$":-.$"'&"1"$%1&%$":$".128('&%$, deoarece compilatorul nu mai poate face o


.1!7$%,($"(28'(.()35" !"&,)*$'":$",()-&+((",$"*1'1,$/)$"1".1!7$%)(%$"$=8'(.()3"<explicit casting).

MyObject myObj = (MyObject)obj;

!")(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.

public enum Direction {


NORD, SUD, EST, VEST
}

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.

for (Direction dir : Direction.values()) {


//
}

L)-!.(".G!:":$*(!(2".G28-%("/("2$)1:$"4!")(8-%('$"$!-29".1!,)&!)$'$"$!-2$%3%((")%$;-($",3"*($"8%(2$'$"
(!,)%-.+(-!("/(")%$;-($")$%2(!&)$".-"WXW5

F(8-%('$"$!-2"81)"&7$&"/("constructori. Constructorul este apelat la crearea constantelor declarate la


4!.$8-)-'")(8-'-(5"N7$!)-&'(("8&%&2$)%(",-!)")%$.-+("'&":$.lararea constantelor. Programatorul nu poate
&8$'&"</("!-"&%$"8$!)%-".$>".1!,)%-.)1%-'"-!-("$!-29":%$8)"8$!)%-".&%$"&.$,)&")%$;-($",3"&(;3"&..$,-'"
package-private sau private.

public enum Direction {


NORD (0, -1),
EST (1, 0),
SUD (0, -1),
VEST (-1, 0);

private final int x, y;


Direction(int x, int y) {
this.x = x; this.y = y;
}
int x() { return x; }
int y() { return y; }
}

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.

Tipuri de diagrame UML:

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/$"$)

2.2.2. Diagrama de clase


Diagrama de clase descrie structura unui sistem0&)3"1(3(4&"*$!5/*(3(4&%(*6'(3(&7!&$(3"-!!3(&'!.*$(&)3"1(2

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($"-!!

23%)4+0"*&0&'"),&(1*(&6&)3"1,&"51*$")*,&1"/&6&!.*($;"-,4&./%(3(&(1*(&1)$!1&)/&!*"3!) 7!/sau este adaugat


stereotipul « abstract » sau « interface ».

Atributele "/&/$%,*6"$("&1!.*"?,0&vizibilitate nume : tip = !"#!$%&'$%(%)*+*,-.

56)$".!!0)/Metodele "/&/$%,*6"$("&1!.*"?,0&vizibilitate nume (lista_parametrii) : tip_returnat.


Parametrii din lista de parametrii sunt sub forma: in/out nume: tip.

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&#634&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. !"#$%&'#()(*$+#(&+&paradigmelor 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"

1.1.3. Paradigma de orientare pe obiect


N-.#+!')"2'"0)=5"',('"6')"2'"obiect. @6',()"%-)('"4#"%*#9#("6)"-"'!(#()('"&-3#65"6-$%+,5"2#!"2)('"7#"2#!"
-%'*).##"6'"%-("4#"'4'6(+)('"),+%*)")6',(-*)8"F*#!(*'"%*#$'&'"&#$0)1'"2#!")6'),(5"6&),5")+"4-,(":$)&&()&I"
7#";<<8

G.Booch: "Object-Oriented Analysis with Applications", Addison-Wesley, 1994

„?)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('!#*'”.

Cele 3 caracteristici ale paradigmei OO sunt:

Î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*')*')")%&#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)&#2'"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"

Câteva caracteristici care fac C++ un better C (exceptând avantajele POO):

Z:(*-!3"DT%#!3ZL"@6'),(5"6)*)6('*#,(#65"%*'9#!'"$+lte erori de programare comune.


B"&#0*5*#'",()!2)*2"$)#"$)*'L"STL.
ZF)*)$'('*#='2"DT%#!3ZL"%*-3*)$)(-*##"%-(",6*#'"#$%&'$'!(5*#"3'!'*#6'")&'")&3-*#($#&-*8"?)65"
M!";"-"#$%&'$'!()*'"3'!'*#65")"+!'#"&#,('")*")*5()"),(4'&L"

struct element_t {
struct element_t *next, *prev;
void *element;
};
6-2+&"'6K#9)&'!("#!";<<")*)(5"),(4'&L

template <typename T>


struct element_t {
element_t<T> *next, *prev;
T element;
};

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#")%&#6).##";@?/"&#$0)1+&"4-&-,#("4##!2";<<8":6-%+&")6',(-*"
)%&#6).##"!+"',('"M!,+7#*')")!+$#(-*"'&'$'!('"2#!"6'&'"2-+5"&#$0)1'"6#"%+!'*')"M!"'9#2'!.5")"
avantajelor folosirii principiilo*"%*-3*)$5*##"-*#'!()('"%'"-0#'6(8

@%&#6).#)"#!('*%*'(')=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'",#$%&#4#6)*'")")%&#6).#'#",'"9)"4-&-,#"6)"$'2#+"2'"2'=9-&()*'"9'6K#+&"J-*&)!2
;<<",#"&#0*5*#)"3*)4#65"J[P8"F'!(*+")"!+")9')"%*-0&'$'"2'"%'*4-*$)!.5")"*+&5*##")6',(+#"$'2#+"?B:"
,+0",#,('$+&"2'"-%'*)*'"\#!2-],/",'"4-&-,'7('"+!"'$+&)(-*"%'!(*+")%&#6).##"?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")%&#6).#'#"9)"',('"-4'*#(58

@%&#6).#)"-4'*5"-"6-!,-&5",#$%&5"%*#!"6)*'",'"#!(*-2+6"2#9'*,'"6-$'!=#L

clear:7('*3'*'")"'6*)!+&+#"
exit:#'7#*'"2#!")%&#6).#'"
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)&#4#6)('"!'",6+('7('"2'"6*')*')"2'"
!-#"4+!6.##"6+")6'&)7#",6-%"2)*"6+"!+$'"2#4erite:

class LineForm : public Form {


public:
LineForm() {
params = new int[4];
}
int read();
void paint();

3
Paradigme de Programare
Laboratorul 1

void status(char *s);


};

// LineForm functions
int LineForm::read() {

void LineForm::paint() {

void LineForm::status(char *s) {

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;
};

class LineForm : public Form {


public:
LineForm() {
params = new int[4];
}
int read();
void paint();
void status(char *s);
};

class CircleForm : public Form {


public:
CircleForm() {
params = new int[3];
}
int read();
void paint();
void status(char *s);
};

// more Form inhertances here...

void graph_init();
Form* get_command();

Form* forms[] = {

4
Paradigme de Programare
Laboratorul 1

new LineForm(), new CircleForm()


};
int n_forms = 2;

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));
}

void LineForm::status(char *s) {


sprintf(s, "line(x1: %d, y1: %d, x2: %d, y2: %d)",
*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));
}

void CircleForm::status(char *s) {


sprintf(s, "circle(x:%d, y:%d, radius:%d)",
*params, *(params+1), *(params+2));
}

// more forms implementations here...

1.4. <(0%
^>(#!2'.#")%&#6).#)"-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!")%&#6).#'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)")%&#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

You might also like