Documente Academic
Documente Profesional
Documente Cultură
Obiective
• Sabloane de proiectare.
Evaluarea
Activitati asociate cursului
• Curs
– Prezenta obligatorie • Examen final in sesiune:
• Laborator: – Scris – nota ES
– Prezenta obligatorie – Practic- nota EP
– Teme de laborator – nota pentru fiecare L1, L2, …
• Media (ponderata) lor va fi notata cu LL – Nota Finala
– Proiect – nota LP
• Seminar: N = (LL*30 + LP*15 + ES*25+ EP*30)/100 +S
– Prezenta obligatorie
– Activitatea – poate conduce la cresterea finala a notei finale cu pana la 1 punct-
S
1
10/12/2015
Analiza si Proiectare
Cateva referinte…
• “Cine va folosi sistemul?" (pentru a descoperi actorii)
• Bruce Eckel, Thinking in Java, Ed. Prentice Hall, 4thedition, 2006. • “Ce pot face acesti actori cu sistemul?"
• Larry O’Brien and Bruce Eckel, Thinking in C#, Ed. Prentice Hall, 2002. • “Cum poate sistemul reactiona daca altcineva face acestea?"
• E. Gamma, R. Helm, R. Johnson, J. Vlissides, DesignPatter ns – Elements of (pentru a descoperi variatiile)
Reusable Object Oriented Software, Ed. Addison Wesley, 1994. • “Ce probleme pot apare in sistem?"
• Kent Beck, Test Driven Development: By Example, Ed. Addison-Wesley Professional, (pentru a descoperi exceptiile)
2002.
• Craig Larman, Applying UML and Patterns: An Introduction to Object-Oriented
Analysis and Design and Iterative Development, Ed. Addison Wesley,2004. 1. Descoperirea obiectelor
• Tutoriale Java si C# 2. Asamblarea obiectelor
http://download.oracle.com/javase/tutorial/ 3. Constructia sistemului
http://msdn.microsoft.com/en-us/library/aa288436%28v=vs.71%29.aspx 4. Extensia sistemului
5. Reutilizarea obiectelor
Limbajul JAVA
LOO Pur
2
10/12/2015
• Compilatorul Java genereaza byte-code pentru Java Virtual Machine (JVM - interpretorul si
sistemul run-time), si nu cod masina.
bytecode
• A executa un program Java = interpretorul Java executa byte-codul compilat compilare
MyClass.java MyClass.class
• Byte-codul Java este independent de platforma Programele Java se pot executa pe orice
platforma pe care exista JVM. executat pe
• Intr-un mediu interpretat, faza standard de "link-edit" nu mai exista.
Java Virtual Machine
• Daca e sa consideram ca Java are faza link, atunci aceasta inseamna doar procesul de > javac MyClass.java executat pe
incarcare a noilor clase in mediu, proces care este unul incremental, si apare la run-time
> java MyClass
(executie).
Host Machine
• O aplicatie Java se poate executa pe orice sistem, cu conditia ca pe acel sistem sa fie
implementata Java Virtual Machine.
• Acest lucru este important pentru aplicatiile distribuite pe Internet sau pe retele
heterogene.
3
10/12/2015
• Mecanismul automatic garbage collection previne ‘umplerea’ memoriei si alte erori 3. Prin atasarea de semnaturi digitale codului Java, originea codului respectiv poate fi
stabilita intr-un mod sigur criptografic.
datorate alocarii si dealocarii memoriei.
4
10/12/2015
• Internationalizare este procesul de proiectare a unei aplicatii astfel incat sa poata fi adaptata
Java este un limbaj interpretat, deci este dificil a se obtine o performatnta ca timp diferitelor limbi si conventii de notare, fara reprogramare.
de executie similara programelor C sau C++ (nu este insa exclusa).
UNICODE (www.unicode.org)
Codul C compilat se executa in general mai repede decat bytecodul Java
interpretat. • Caracterele Java sunt caractere 16-bit Unicode.
◦ Viteza este insa mai mult decat adecvata pentru aplicatiile interactive( GUI) si • Deoarece majoritatea mediilor nu suporta codificarea Unicode, Java foloseste o faza de pre-
pentru aplicatiile retea, pentru care aplicatia asteapta deseori imput de la procesare pentru a asigura faptul ca toate caracterele unui program sunt in Unicode.
utilizator sau date din retea. • Java defineste secvente escape care permite folosirea tuturor caracterelor (\uxxxx, unde xxxx
◦ Sectiunile critice d.p.d.v. ale vitezei sunt implementate prin cod nativ eficient este o secventa de patru cifre hexazecimale )
• Unicode defineste codurile de la 0 la 127 in mod consistent cu ASCII.
Multe interpretoare Java includ acum "just in time compilers” care pot transforma
Java byte-codes in cod-masina pentru un CPU particular. char newline = '\n', apostrophe = '\", delete = '\377‘;
char aleph='\u05D0‘, a = ‘A’ , aa=\u0103;
Java este un limbaj multithreaded .
Un exemplu simplu
Hello World!
Limbajul C#
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
• Compilare
> javac HelloWorld.java
• Executie
> java HelloWorld
5
10/12/2015
Abstractizare…
• (C#, Managed C++, Visual Basic .NET, etc), la compilare toate vor produce cod ın
acelasi limbaj intermediar: CIL
6
10/12/2015
7
10/12/2015
8
10/12/2015
Tipuri primitive
Java
Declarare
Variabile:
Java 1 ++
--
arithmetic
arithmetic
R
R
pre-or-post increment (unary)
pre-or-post decrement (unary) Scope = {…} (Domeniu de vizibilitate)
operators +, -
~
arithmetic
integral
R
R
unary plus, unary minus
bitwise complement (unary)
! boolean R logical complement (unary)
• Nu este permisa “ascunderea unei variabile intr-un sub-scope
(type) any R cast
2 *, /, % arithmetic L multiplication, division, remainder
3 +, - arithmetic L addition, subtraction {int x = 12;
+ string L string concatenation
4 << integral L left shift { int x = 96; /* illegal */
>> integral L right shift with sign extension
>>> integral L right shift with zero extension }
5 <, <= arithmetic L less than, less than or equal
>, >=
instanceof
arithmetic
object, type
L
L
greater than, greater than or equal
type comparison
}
6 ==
!=
primitive
primitive
L
L
equal (have identical values)
not equal (have different values)
Object scope
== object L equal (refer to same object) {
!= object L not equal (refer to different objects)
7 & integral L bitwise AND String s = new String("a string");
& boolean L boolean AND
} /* end of scope */
8 ^ integral L bitwise XOR
^ boolean L boolean XOR
9 | integral L bitwise OR
| boolean L boolean OR
10 && boolean L conditional AND
11 || boolean L conditional OR
12 ?: boolean, any, any R conditional (ternary) operator
13 = variable, any R assignment
*=, /=, %=, +=, -=, <<=,
variable, any R assignment with operation
V. Niculescu
>>=, >>>=, &=, ^=, |= - MAP 35 V. Niculescu - MAP 36
9
10/12/2015
• Toate tipurile de date sunt derivate (direct sau nu) din tipul System.Object, • Set de tipuri predefinite, pentru care nu este necesara referirea vreunui spatiu de
nume via directiva using sau calificare completa.
• Mod unitar de tratare ! • Exemple:
– string,
– object,
– tipurile ıntregi cu semn ¸si fara semn,
– tipuri numerice ın virgula mobila,
– tipurile bool si decimal.
• Tipul string este folosit pentru manipularea ¸sirurilor de caractere codificate
Unicode; continutul obiectelor de tip string nu se poate modifica
10
10/12/2015
• Toate tipurile valoare sunt derivate din clasa System.ValueType, care la randul ei
este derivata din clasa object (alias pentru System.Object).
• Nu este posibil ca dintr–un tip valoare sa se deriveze.
• Atribuirea pentru un astfel de tip ınseamna copierea valorii!!!
• Tipurile simple sunt identificate prin cuvinte rezervate, dar acestea reprezinta doar
alias–uri pentru tipurile struct corespunzatoare din spatiul de nume System.
11
10/12/2015
Tipul decimal
• Este un tip de date reprezentat pe 128 de biti, Instructiuni de control
• gandit a fi folosit ın calcule financiare sau care necesita precizie mai mare.
• Poate reprezenta valori aflate ın intervalul 1.0 × 10−28 ¸7.9 × 1028, cu 28 de cifre
semnificative. • Java
• nu poate reprezenta zero cu semn, infinit sau NaN. • C#
• nu se fac conversii implicite ıntre nici un tip ın virgul˘a mobila si decimal
• nu este posibila mixarea variabilelor de acest tip ıntr-o expresie, fara conversii
explicite.
• Literalii se exprima folosind ca sufix caracterele m sau M.
Tipul bool
• Este folosit pentru reprezentarea valorilor de adevar true si false.
• Nu exista conversii standard ıntre bool si nici un alt tip.
12
10/12/2015
Instructiuni de ciclare
• Instructiunea continue:
– sare peste iteratia curenta din interiorul unui ciclu (for, while, dowhile) • if (expresie logica) instructiune;
– opreste executia instructiunilor din interiorul unui ciclu si determina • if (expresie logica) instructiune; else instructiune;
reevaluarea expresiei booleene.
int[] x= { 2, 8, 3, 5, 12, 8, 62}; • switch (expresie)
int elem = 8; {
int nrApar=0; case eticheta: instructiune;
for (int i = 0; i < x.length; i++) { case eticheta: instructiune;
if (x[i] != elem) ...
continue; default: instructiune;
nrApar++; }
}
13
10/12/2015
Exemplu
switch (i)
Exemple instructiuni de ciclare
{
case 0:
Console.WriteLine("0"); while (r != 0)
break; {
case 1: r = a%b; a = b; b = r;
Console.Write("Valoarea "); }
goto case 2;
case 2: do
case 3:
{
Console.WriteLine(i);
break; S += i++;
case 4: }while(i<=n)
goto default;
default: for (int i=0; i<n; i++)
Console.WriteLine("Numar in afara domeniului admis"); {
break;//neaparat, altfel eroare de compilare Console.WriteLine("i={0}", i);
}
}
14
10/12/2015
Comentarii
Definirea Constantelor
Clase
• Orice variabila declarata final in Java reprezinta o constanta
– initializarea trebuie facuta la declarare
[ abstract][ final][public] class <name>
Ex. private final int x = 2;
[extends <superclass_name>]
//c, c++
#define PI 3.14159
[implements <interface_name> [, <interface_name>] * ]
const double PI = 3.14159; a static final declarata in interiorul unei clase
{
15
10/12/2015
16
10/12/2015
• Referentierea si dereferentierea obiectelor se face automat. • Valoarea implicita pentru variabilele de tip referinta este null.
– null este un cuvant rezervat si corespunde unei valori care indica faptul ca
• Java nu permite manipularea pointerilor sau a adreselor de memorie: variabila nu refera nici un obiect.
– NU este permisa transformarea prin cast a unei referinte la obiect sau la tablou (in C NULL este doar o constanta egala cu 0)
la intregi si vice-versa.
– NU este permisa aritmetica cu adrese. • null nu poate fi transformat prin cast la nici un tip primitiv. Nu trebuie sa fie
– NU este permisa calcularea marimii reprezentarii in octeti pentru nici un tip considerat a fi egal cu zero desi ar putea fi implementat in acest fel.
primitiv sau obiect.
Exemplu
Exemplu –swap - eronat!
Complex p, q;
p = new Complex();
// p refers to a Complex object. public void swap( Object a, Object b)
q = p;
{
// q refers to the same object of type Complex.
p.setReal(10.2); Object temp = a;
// A change to the object through p... a = b;
double r = q.getReal(); b = temp;
// ...is also visible through q. }
// r now contains 10.2
17
10/12/2015
Complex a = new Complex(1,1); • Operatorul == testeaza daca doua variabile refera acelasi obiect, si nu daca doua obiecte au
Complex b = new Complex(); aceeasi stare.
a = b;
• Pentru a se putea folosi metoda clone() clasa respectiva trebuie sa implementeze interfata
Cloneable.
Tablouri Tablouri(2)
• Sunt create dinamic (new); ca si obiectele: -> clasa Array int lookup_table[] = {1, 2, 4, 8, 16, 32, 64, 128};
18
10/12/2015
int i; String s;
• C vs. Java
// for clasic
void reverse(char strbuf[], int buffer_size) { for(i=0, s = "testing"; // Initializare
char buffer[500]; (i < 10) && (s.length() >= 1); // Testare pentru continuare.
...} i++, s = s.substring(1)) // avans
{ System.out.println(s); // corpul ciclului
}
void reverse(char[] strbuf, int buffer_size) {
char[] buffer = new char[500];
String my_array[] = {“Ana”,”Maria”,”Lia”,”Ioana”};
...}
// for clasic
for(int i = 0; i < my_array.length; i++)
• lungimea unui tablou nu face parte din tip ca in C System.out.println("a[" + i + "] = " + my_array[i]);
String[] strings;
// this variable can refer to any String array //new for (for each)
strings = new String[10]; for (String s: my_array)
System.out.println(s);
// one that contains 10 Strings
strings = new String[20];
// or one that contains 20.
19
10/12/2015
• functionalitate adaugata incepand J2SE 5.0 • String-urile in Java nu sunt terminate printr-un caracter nul cum sunt in C
void someMethod(Object ... args) {
• sunt instante ale clasei java.lang.String sau ale clasei StringBuffer
// do something
} • obiectele de tip String sunt nemodificabile
someMethod("arg1", "arg2", "arg3");
• Exemplu1: • obiectele de tip StringBuffer sunt modificabile
System.out.printf("%s %3d", name, age);
• Cateva metode ale clase String::
• Doar o data si la sfarsit…
• Exemplu2: – length
public static void variabil(int x, int...a){ – charAt
for (int i: a) – equals
System.out.println(i*x); – compareTo
} – indexOf
public static void main(String args[]){ – lastIndexOf
int t_int[] = {1,2,3 ,4}; – substring
variabil(2, t_int);
variabil(2, 1, 2, 3 ,4);
}
Comentarii C#
20
10/12/2015
21
10/12/2015
Tablouri multidimensionale
-rectangulare Nr. Dimensiuni -> Rank
-neregulate (jagged arrays) …> Java (Rank = proprietate in clasa System.Array)
using System;
class Test
{ using System;
• Declarare public static void Main() class Dimensiuni
int[,] tab; {
tab = new int[2,3]; int[,] tabInm = new int[10,10];
{
tab[i, j]. for( int i=0; i<tabInm.GetLength(0); i++ ) public static void Main()
• initializare: { {
int[,] tab = new int[,] for( int j=0; j< tabInm.GetLength(1); j++) int[] t1 = new int[2];
{{1,2},{3,4}}; {
tabInm[i,j] = i * j;
int[,] t2 = new int[3,4];
int[,] tab = {{1, 2}, {3, 4}}; int[,,] t3 = new int[5,6,7];
}
• Referire element: } Console.WriteLine(‘‘t1.Rank={0}\n t2.Rank={1}\n t3.Rank={2}’’,
tab[i,j] for( int i=0; i<tabInm.GetLength(0); i++) t1.Rank, t2.Rank, t3.Rank);
{
Exemplu:tabla inmultirii for( int j=0; j<tabInm.GetLength(1); j++) }
{ }
Console.WriteLine(‘‘{0}*{1}={2}’’, i, j, Pe ecran va aparea:
tabInm[i,j]);
}
t1.Rank=1
} t2.Rank=2
Console.WriteLine(‘‘tabInm.Length={0}’’, t3.Rank=3
tabInm.Length);
//tabInm.Length=100
Tablouri neregulate
using System; foreach
class JaggedArray
• Reprezinta un tablou de tablouri. {
public static void Main()
• Declararea : {
int[][] tab; int[][] a = new int[2][]; int[] numbers = { 4, 5, 6, 1, 2, 3, -2, -1, 0 };
a[0] = new int[2];
• Referirea : a[1] = new int[3]; foreach (int i in numbers)
tab[i][j] for( int i=0; i<a[0].Length; i++)
{ {
• Initializarea a[0][i] = i;
int[][] myJaggedArray = new int [][] } System.Console.Write("{0} ", i);
for( int i=0; i<a[1].Length; i++) }
{ {
new int[] {1,3,5,7,9}, a[1][i] = i * i; // Output: 4 5 6 1 2 3 -2 -1 0
}
new int[] {0,2,4,6}, for(int i=0; i<a.Length; i++)
new int[] {11,22} {
}; for( int j=0; j<a[i].Length; j++ )
{
Console.Write(‘‘{0} ’’, a[i][j]);
Sau }
Console.WriteLine();
int[][] myJaggedArray = { }
new int[] {1,3,5,7,9}, Console.WriteLine(‘‘a.Rank={0}’’,
a.Rank);
new int[] {0,2,4,6}, }
}
new int[] {11,22} va scrie pe ecran:
}; 0 1
0 1 4
Sau (vezi exemplu) a.Rank=1
22
10/12/2015
Exemplu Varianta:
Fixed Size Buffers
using System;
class Class1 String[] tokens = s.Split( new char[]{’ ’, ’,’},
{ StringSplitOptions.RemoveEmptyEntries );
static void Main(string[] args) private fixed char name[30];
{
String s = "Oh, I hadn’t thought of that!";
char[] x = {’ ’, ’,’ };
String[] tokens = s.Split( x );
for(int i=0; i<tokens.Length; i++) This is useful when you are working with existing code, such as code written in
{ other languages…
Console.WriteLine("Token: {0}", tokens[i]);
}
}
}
Output:
Token: Oh
Token:
Token: I
Token: hadn’t
Token: though
Token: of
Token: that!
23
10/12/2015
params Boxing/unboxing
public class MyClass
{
• Permite numar variabil de parametrii public static void UseParams(params int[] list) • Conversia de tip boxing permite oricarui tip valoare sa fie implicit convertit catre
{ tipul object sau catre un tip interfata implementat de tipul valoare.
• Parametrii actuali pot fi for (int i = 0; i < list.Length; i++)
{
– o lista de parametrii separati prin Console.Write(list[i] + " ");
virgula sau • Boxing–ul unei valori consta ın alocarea unei variabile de tip obiect si copierea
}
– un tablou. Console.WriteLine(); valorii initiale ın acea instanta.
}
}
}
24
10/12/2015
Pointers in C#
Clase C#
• Clasele reprezinta tipuri referinta. O clasa poate sa mosteneasca o
• Can be used in an unsafe context - only singura clasa ¸si poate implementa mai multe interfete.
• Membrii:
– constante,
– campuri,
– metode,
– proprietati,
– evenimente,
– indexatori,
– operatori,
– constructori de instanta,
– destructori,
– constructori de clasa,
– tipuri imbricate.
25
10/12/2015
Structuri Exemplu
public class Tester
• tipuri de date asemanatoare claselor, using System; {
– diferenta -> sunt tipuri valoare public struct Point public static void MyFunc(Point loc)
{
Sunt considerate versiuni “usoare” ale claselor, sunt folosite predilect pentru tipuri {
public Point(int xCoordinate, int yCoordinate)
{ loc.X = 50;
pentru care aspectul comportamental este mai putin pronuntat. loc.Y = 100;
xVal = xCoordinate;
• Modificatori: new, public, protected, internal, private. yVal = yCoordinate; Console.WriteLine(‘‘In MyFunc loc: {0}’’, loc);
} }
• O structura este automat derivata din System.ValueType, care la randul ei este derivata din public int X
System.Object ; de asemenea, este automat considerata sealed { static void Main( )
get {
• Poate sa implementeze una sau mai multe interfete. {return xVal;} Point loc1 = new Point(200,300);
set
Console.WriteLine(‘‘Loc1 location: {0}’’, loc1);
• poate sa contina: { xVal = value; }
} MyFunc(loc1);
– constante, campuri, public int Y Console.WriteLine(‘‘Loc1 location: {0}’’, loc1);
{ }
– metode, proprietati, get }
– evenimente, indexatori, operatori, { return yVal; }
set
– constructori, constructori statici, { yVal = value; } Output:
} Loc1 location: 200, 300
– tipuri imbricate. public override string ToString( )
In MyFunc loc: 50, 100
{
• Nu poate defini destructor! return (String.Format(‘‘{0}, {1}’’, xVal,yVal)); Loc1 location: 200, 300
• La atribuire, se face o copiere a valorilor continute de catre sursa ın destinatie (indiferent de }
public int xVal;
tipul campurilor: valoare sau referinta). public int yVal;
}
• Daca programatorul defineste un constructor, atunci acesta trebuie sa dea valori initiale pentru
Particularitati pentru structuri campurile continute, altfel apare eroare la compilare.
• Campurile nu pot fi initializate la declarare; • Daca nu se apeleaza new, atunci respectiva instanta nu va avea asociata nici o valoare
(constructorul implicit nu este apelat automat!).
• Nu se poate defini un constructor implicit.
– Cu toate acestea, compilatorul va crea un astfel de constructor, care va initializa
• Nu se poate folosi respectiva variabila de tip structura decat dupa ce i se initializeaza toate
campurile la valorile lor implicite
campurile:
• Pentru tipul Point de mai sus, urmatoarea secvena de cod este corecta: {
Point a = new Point(0, 0); Point p;
Point b = new Point(); //p.xVal=p.yVal=0;
• Un constructor implicit este apelat atunci cand se creeaza un tablou de structuri: Console.WriteLine(p);
Point[] points = new Points[10]; }
for( int i=0; i<points.Length; i++ ) eroare de compilare: Use of unassigned local variable ‘p’
{
Console.WriteLine(points[i]); • Nu se poate declara destructor. Acestia se declara numai pentru clase.
}
• Boxing: Daca o instanta de tip struct este folosita acolo unde un object este necesar, atunci se
• se creeaza un obiect de tip tablou ın heap, dupa care ın interiorul lui (si nu pe stiva!) se va face automat o conversie implicita catre System.Object
creeaza cele 10 puncte (alocare inline).
26
10/12/2015
• De asemenea, la transmiterea prin valoare a unei structuri, se va face copierea Object.ReferenceEquals(Object obj1, Object, obj2)
tuturor campurilor continute pe stiva, ceea ce poate duce la un overhead
semnificativ • Metoda
System.ValueType.Equals
27
10/12/2015
public struct Single : IComparable, IFormattable, public static bool IsNumeric(ValueType value)
IConvertible, IComparable<float>, IEquatable<float> {
if ( ! (value is Byte ||
alias float value is Int16 ||
value is Int32 ||
value is Int64 ||
public struct Double : IComparable, IFormattable, IConvertible, value is SByte ||
IComparable<double>, IEquatable<double>
value is UInt16 ||
value is UInt32 ||
alias double value is UInt64 ||
• Metode … value is BigInteger ||
IsInfinityReturns a value indicating whether the specified number evaluates to negative or value is Decimal ||
positive infinity value is Double ||
IsNaNReturns a value that indicates whether the specified value is not a number (NaN). value is Single))
IsNegativeInfinityReturns a value indicating whether the specified number evaluates to negative return false;
infinity. else
IsPositiveInfinityReturns a value indicating whether the specified number evaluates to positive return true;
infinity. }
Exemplu : clasa
class MyClass public int MyProperty class Test
{ { {
public MyClass() get static void Main()
{ { {
Console.WriteLine return myField; MyClass a = new MyClass(); • Constructorii instanta sunt membri care implementeaza actiuni cerute pentru initializarea
("Constructor instanta"); } MyClass b = new MyClass(1); fiecarui obiect.
} set Console.WriteLine("MyConst={0}",
public MyClass( int value ) { MyClass.MyConst);
• Destructorul
{ myField = value; //a.myField++; – nu are parametri,
myField = value; } a.MyMethod();
Console.WriteLine("Constructor } a.MyProperty++;
– nu poate avea modificatori de acces,
instanta"); public int this[int index] Console.WriteLine – nu poate fi apelat explicit ci este apelat automat de catre garbage collector.
} { ("a.MyProperty={0}", a.MyProperty);
public const int MyConst = 12; get • Constructorul static este un membru care implementeaza actiuni necesare pentru a initializa
a[3] = a[1] = a[2];
{ Console.WriteLine("a[3]={0}", a[3]); o clasa, mai exact membrii statici ai clasei.
private int myField = 42; return 0; MyClass c = a + b; – Nu poate avea parametri,
}
public void MyMethod() set internal class MyNestedType
– nu poate avea modificatori de acces,
{ { {} – nu este apelat explicit, ci automat de catre sistem.
Console.WriteLine Console.WriteLine("t }
("this.MyMethod"); his[{0}]={1}", • Indexatorul este un membru care permite unui obiect sa fie indexat ın acelasi mod ca un
} index, value); tablou (C++: supraıncarcarea operatorului []).
} }
public static MyClass }
operator+(MyClass a, MyClass b) • Operatorul este un membru care defineste semnificatia (supraıncarcarea) unui operator care
{ se aplica instantelor unei clase.
return
new MyClass(a.myField + b.myField); – Se pot supraıncarca operatorii binari, unari si de conversie.
}
}
V. Niculescu - MAP 111 V. Niculescu - MAP 112
28
10/12/2015
Proprietati Exemplu
• O proprietate este un membru care permite acces la partea de stare a using System; }
unei clase.
class Circle }
• Proprietatile sunt extensii naturale ale campurilor, dar!!! ele nu presupun
alocarea de memorie. {
• Sintaxa: private double radius; class Test
modificator-de-proprietate{opt} public double Radius {
tip numeproprietate
definitie-get{opt} { static void Main()
definitie-set{opt}
get{return radius;} {
• Modificatorii de acces sunt: protected, internal, private, protected internal,
public. set Circle c = new Circle();
{radius = value;} c.Radius = 10;
V. Niculescu - MAP 113
} Console.WriteLine(‘‘Are
V. Niculescu - MAP 114
– Singleton Pattern
29
10/12/2015
30
10/12/2015
public static int num_obj; 2. Unei date membru statice i se aloca memorie o singura data
public Circle(double x, double y, double r) {
indiferent de numarul obiectelor de tipul clasei respective existente
this.x = x; this.y = y; this.r = r; in memorie.
num_obj++; 3. Referirea datelor membre statice se face astfel:
}
// ...
NumeClasa.numeDataMembru sau
public static void main(String args[]){ numeObiect.numeDataMembru.
System.out.println(Circle.num_obj);
Circle c = new Circle(10.0,10.0,20);
System.out.println(Circle.num_obj); 4. Daca o data membru statica nu este initializata explicit, atunci ea va
} fi initializata cu valoarea implicita corespunzatoare tipului sau.
31
10/12/2015
Observatii: C#
1. Metodele de tip clasa (statice) se declara folosind atributul static in fata. • Clase:
– Definire membrii
2. O metoda statica nu poate folosi direct membrii nestatici ai clasei (atribute sau metode)!
– Instantiere
3. Metodele statice pot apela doar alte metode statice si pot referi doar atributele statice.
Exemplu : clasa
class MyClass public int MyProperty class Test
{ { {
public MyClass() get static void Main()
{ { {
Console.WriteLine return myField; MyClass a = new MyClass(); • Constructorii instanta sunt membri care implementeaza actiuni cerute pentru initializarea
("Constructor instanta"); } MyClass b = new MyClass(1); fiecarui obiect.
} set Console.WriteLine("MyConst={0}",
public MyClass( int value ) { MyClass.MyConst);
• Destructorul
{ myField = value; //a.myField++; – nu are parametri,
myField = value; } a.MyMethod();
Console.WriteLine("Constructor } a.MyProperty++;
– nu poate avea modificatori de acces,
instanta"); public int this[int index] Console.WriteLine – nu poate fi apelat explicit ci este apelat automat de catre garbage collector.
} { ("a.MyProperty={0}", a.MyProperty);
public const int MyConst = 12; get • Constructorul static este un membru care implementeaza actiuni necesare pentru a initializa
a[3] = a[1] = a[2];
{ Console.WriteLine("a[3]={0}", a[3]); o clasa, mai exact membrii statici ai clasei.
private int myField = 42; return 0; MyClass c = a + b; – Nu poate avea parametri,
}
public void MyMethod() set internal class MyNestedType
– nu poate avea modificatori de acces,
{ { {} – nu este apelat explicit, ci automat de catre sistem.
Console.WriteLine Console.WriteLine("t }
("this.MyMethod"); his[{0}]={1}", • Indexatorul este un membru care permite unui obiect sa fie indexat ın acelasi mod ca un
} index, value); tablou (C++: supraıncarcarea operatorului []).
} }
public static MyClass }
operator+(MyClass a, MyClass b) • Operatorul este un membru care defineste semnificatia (supraıncarcarea) unui operator care
{ se aplica instantelor unei clase.
return
new MyClass(a.myField + b.myField); – Se pot supraıncarca operatorii binari, unari si de conversie.
}
}
V. Niculescu - MAP 127 V. Niculescu - MAP 128
32
10/12/2015
Proprietati Exemplu
using System; class Test
class Circle {
• O proprietate este un membru care permite acces la partea de stare { static void Main()
a unei clase.
private double radius; {
public double Radius Circle c = new Circle();
• Proprietatile sunt extensii naturale ale campurilor. { c.Radius = 10;
get{return radius;} Console.WriteLine(‘‘Area: {0}’’, c.Area);
• Sintaxa: set c.Area = 15;
{radius = value;} Console.WriteLine(‘‘Radius: {0}’’. c.Radius)
} }
modificator-de-proprietate{opt}
public double Area }
tip numeproprietate {
definitie-get{opt} get{return Math.PI * radius * radius;}
definitie-set{opt} set{radius = Math.Sqrt(value/Math.PI);}
}// nerecomandata!!!
• Modificatorii de acces sunt: protected, internal, private, protected Preferabil Read Only
internal, public. }
Sintaxa Clase
Comparatie Java versus C# • Java • C#
[public] [final ] class A{ [public][sealed] class A{
} }
• Mostenire
class A extends B{ class A: B {
} }
• implementare interfete
class implements I1, I2{ class A : I1, I2 {
} }
• clase statice
static class MyStaticClass
{
//membri statici
}
33
10/12/2015
class A{ class A{
public A(){... public A(){...
} }
} }
34
10/12/2015
137
V. Niculescu - MAP 137 V. Niculescu - MAP 138
• cuvant rezervat: virtual • Modificatori: new, public, protected, internal, private, protected internal,
virtual, sealed, override, abstract, extern.
35
10/12/2015
36
10/12/2015
Rational
Rational
146
V. Niculescu - MAP 145 V. Niculescu - MAP 146
37
10/12/2015
using System;
using System.Text;
namespace OverrideAndNew
{ class Program
{ static void Main(string[] args)
{
“Hiding”
BaseClass bc = new BaseClass();
DerivedClass dc = new DerivedClass();
BaseClass bcdc = new DerivedClass();
class Base
// The following two calls do what you would expect. They call
// the methods that are defined in BaseClass. {
bc.Method1();
bc.Method2(); public static void F() {}
// Output:
// Base - Method1 }
// Base - Method2
class Derived: Base
// The following two calls do what you would expect. They call {
// the methods that are defined in DerivedClass.
dc.Method1(); new private static void F() {} // Hides Base.F in Derived only
dc.Method2();
// Output: }
// Derived - Method1
// Derived - Method2 class MoreDerived: Derived
// The following two calls produce different results, depending
{
// on whether override (Method1) or new (Method2) is used. static void G() { F(); } // Invokes Base.F
bcdc.Method1();
bcdc.Method2(); }
// Output:
// Derived - Method1
// Base - Method2
}
}
V. Niculescu - MAP 151 V. Niculescu - MAP 152
}
38
10/12/2015
Singleton pattern
• Acest operator este folosit pentru conversii explicite, returnand un obiect de tipul la • Problema: trebuie sa se execute o anumita actiune, dar nu se stie dinainte care
care se face conversia sau null daca conversia nu se poate face (nu se arunca anume, sau chiar ce obiect va trebui efectiv utilizat.
exceptii).
• Determinarea validitatii conversiei se face testand valoarea rezultata fata de null: • Un delegat este un tip referinta folosit pentru a ıncapsula o metoda cu un anumit
daca rezultatul e null atunci conversia nu s–a putut face. antet
• Orice metoda care are acest antet poate fi legata la un anumit delegat.
Exemplu:
Employee e =new Salaried(“Pop”, 12345);
Salaried s = e as Salaried;
if (s != null)
{
//se lucreaza cu instanta valida de tip Salaried
}
39
10/12/2015
Delegati Exemplu:
Problema: trebuie sa se execute o anumita actiune, dar nu se stie dinainte care
anume, sau chiar ce obiect va trebui efectiv utilizat.
using System;
•Un delegat este un tip referinta folosit pentru a ıncapsula o metoda cu un anumit antet
namespace AplicatieDeTest
•Orice metoda care are acest antet poate fi legata la un anumit delegat. {
class Program
• Simulare: public {
delegate int WhichIsFirst(object obj1, object obj2); private delegate int Delegat1(string sir_f);
public interface Delegate{ static int lungime_sir(string sir)
int WhichIsFirst(object obj1, object obj2); class Pair{
{
} private object[] thePair = new object[2];
public void Sort( WhichIsFirst theDelegatedFunc ) return sir.Length;
class Pair{ { }
private object[] thePair = new object[2]; if (theDelegatedFunc(thePair[0],thePair[1]) ==2){
object temp = thePair[0];
static void Main()
public void Sort( Delegate del ) {
{ thePair[0] = thePair[1]; Delegat1 instanta_Delegat=new Delegat1(lungime_sir);
if (del.WhichIsFirst(thePair[0],thePair[1]) ==2){ thePair[1] = temp;}
object temp = thePair[0]; }
Console.Write(instanta_Delegat(“tra la la"));
thePair[0] = thePair[1]; } }
thePair[1] = temp;} }
}} }
Simulare Java
Metode anonime
interface Delegate1{
int functie(string sir); class SomeClass class SomeClass
} { {
class Lungime implements Delegate1{ delegate void SomeDelegate(); delegate void SomeDelegate();
public int functie(string sir){ public void InvokeMethod() public void InvokeMethod()
return sir.length();
{ {
}
SomeDelegate del = new SomeDelegate del = delegate()
}
SomeDelegate(SomeMethod); {
del(); MessageBox.Show("Hello");
class Program
{ } };
public static void main(String []a) void SomeMethod() del();
{ {
Delegat1 instanta_Delegat=new Lungime(); }
MessageBox.Show("Hello"); }
System.out.println(instanta_Delegat.functie(“tra la la"));
} }
} }
40
10/12/2015
41
10/12/2015
Destructori
• nu exista • sintaxa:
• System.GC
• metoda finalize ~<NumeClasa>()
protected void finalize() { public static class GC
}
•apelare automata
•fara parametrii
}
}///:~
42
10/12/2015
Nested classes
class OuterClass {
...
static class StaticNestedClass {
...
Clase incuibate }
class InnerClass {
...
}
}
• Note: A static nested class interacts with the instance members of its outer class (and other classes) just
like any other top-level class. In effect, a static nested class is behaviorally a top-level class that has been
nested in another top-level class for packaging convenience.
• Static nested classes are accessed using the enclosing class name:
OuterClass.StaticNestedClass
OuterClass.StaticNestedClass nestedObject =
new OuterClass.StaticNestedClass();
174
V. Niculescu - MAP 173 V. Niculescu - MAP 174
43
10/12/2015
175 176
V. Niculescu - MAP 175 V. Niculescu - MAP 176
• Nested Interfaces
177 178
V. Niculescu - MAP 177 V. Niculescu - MAP 178
44
10/12/2015
179 180
V. Niculescu - MAP 179 V. Niculescu - MAP 180
using System;
Nested Classes in C# class A
{
class B
{
public static void F()
{
Console.WriteLine(‘‘A.B.F’’);
}
}
static void Main()
{
A.B.F();
}
}
• o clasa C# imbricata se comporta ca un membru static al tipului continator.
45
10/12/2015
46
10/12/2015
Coliziuni
Pachete din Java API
47
10/12/2015
Spatii de nume C#
using System;
Spatii de nume C#
namespace Curs3
{
public class Buffer
{
public Buffer()
{
Console.WriteLine("Bufferul meu!");
}
}
}
48
10/12/2015
Aplicabilitate :
• Vrem sa folosim mai multe sub-clase existente dar este imposibil de adaptat interfata
lor. (doar in cazul obiectului adaptor).
…
49
10/12/2015
Disscusion…
– Simple interface conversion that just changes operation names and order of
arguments
CURS 5
– Totally different set of operations
• Use Adapter when you want to use something that you already have.
Bridge , Template Method, Strategy –
design patterns
Tratarea exceptiilor
50
10/12/2015
Sursa: http://www.codeproject.com/Articles/12183/Design-Your-Soccer-Engine-and-
Clasificarea sabloanelor (GoF) Learn-How-To-Apply-D
Clasificare sabloane –
Riehle and Zullighoven: “Understanding and Using References
Patterns in Software Development”
• Conceptual Pattern • Design Patterns: Elements of Reusable Object-Oriented Software,
– Descriere bazata pe termeni si concepte din domeniul aplicatiei Gamma, Helm, Johnson and Vlissides, Addison-Wesley, 1995
• Design Pattern • Design Patterns for Object-Oriented Software Development,Wolfgang Pree,
Addison-Wesley/ACM Press, 1995
– descriere bazata pe constructii specifice proiectarii software: obiecte,
• Patterns of Software: Tales From The Software Community,Richard P. Gabriel,
clase, mostenire, agregare… Oxford University Press, 1996
• Programming Pattern (Programming Idiom) • Pattern Oriented Software Architecture : A System of Patterns,Frank Buschmann
– descriere bazata pe constructii ale unui limbaj de programare. (Editor), Wiley, 1996
• Analysis Patterns: Reusable Object Models, Martin Fowler,Addison-Wesley, 1997
• AntiPatterns, Brown, Malveau, McCormick and Mowbray,Wiley, 1998
• Design Patterns Explained, Alan Shalloway and James R. Trott, Addison-Wesley,
2001
51
10/12/2015
• Core J2EE Patterns: Best Practices and Design Strategies, Alur,Crupi and • C# Design Patterns - A Tutorial, James W. Cooper, Addison-Wesley, 2002
Malks, 2001 • Design Patterns In C#, Steven John Metsker, Addison-Wesley,2004
• Design Patterns Java Workbook, Steven John Metsker, Addison-Wesley, • Head First Design Patterns, Freeman and Freeman, O'Reilly,2004
2002 • Core Security Patterns - Best Practices and Strategies for J2EE(TM), Web
• Applied Java Patterns, Stephen Stelting and Olav Maassen,Prentice Hall, Services, and Identity Management, Christopher Steel, Ramesh Nagappan
2002 and Ray Lai, Prentice Hall, 2005
• EJB Design Patterns: Advanced Patterns, Processes, and Idioms, Floyd • Refactoring To Patterns, Joshua Kerievsky, Addison-Wesley,2005
Marinescu, Wiley, 2002
• Patterns Of Enterprise Application Archictecture, Martin Fowler, Addison-
Wesley, 2002
Bridge Structura
Context
• Cand o anumita abstractiune poate avea mai multe variante de
implementare, de obicei se utilizeaza mostenirea: o clasa abstracta defineste
interfata abstractiunii, iar subclasele concrete o implementeaza in diverse
moduri. Abstraction:
• Aceasta abordare nu este intotdeauna suficient de flexibila. defineste interfata abstractiunii;
• Prin mostenire o implementare este legata permanent de abstractiune si detine o referinta spre un obiect de tip Implementor.
RefinedAbstraction: extinde interfata Abstraction
acest lucru face foarte dificila modificarea independenta a abstractiunii si a
Implementor: defineste interfata pentru clasele ce contin implementari.
implementarii.
Aceasta interfata nu trebuie neaparat sa corespunda exact cu interfata
Abstraction. De fapt, cele 2 pot fi total diferite. De obicei Implementor ofera
doar operatii primitive, iar Abstraction defineste operatii de nivel mai inalt,
V. Niculescu - MAP 209
bazandu-se pe acele primitive; V. Niculescu - MAP 210
ConcreteImplem: implementeaza interfata Implementor.
52
10/12/2015
Aplicabilitate: Exemplu
• Atunci cand comportamenul comun mai multor clase trebuie sa fie evidentiat si
localizat intr-o clasa comuna pentru a evita duplicarea de cod.
53
10/12/2015
54
10/12/2015
• AbstractCollection : A Collection that is neither a Set nor a List, such as a bag. At a minimum, you must
provide the iterator and the size method. • Strategy este un obiect care reprezinta un algoritm.
• AbstractSet : A Set. Use is identical to AbstractCollection.
• Este folositor atunci cand :
• AbstractList : A List backed by a random-access data store (such as an array). At a minimum, you must
provide the positional access methods (get(int) and, optionally, set(int), remove(int), and add(int)) and the – se doreste inlocuirea unui algoritm static sau chiar dinamic;
size method. The abstract class takes care of listIterator (and iterator).
(public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> ) – exista mai multe variante ale algoritmului,
– sau atunci cand un algoritm are structuri de date complicate pe care doreste sa
• AbstractSequentialList : A List backed by a sequential-access data store (such as a linked list). At a le incorporeze.
minimum, you must provide the listIterator and size methods. The abstract class takes care of the positional
access methods. (This is the opposite of AbstractList.)
• AbstractMap : A Map. At a minimum you must provide the entrySet view. This is typically implemented
with the AbstractSet class. If the Map is modifiable, you must also provide the put method.
• Cand este nevoie de mai multe variante ale unui algoritm. “Strategy” este
folosit atunci cand aceste variante sunt implementate ca o ierarhie de clase
de algoritmi.
55
10/12/2015
Exemplu: sursa-
http://a3ab771892fd198a96736e50.javacodegeeks.netdna-cdn.com/wp-
content/uploads/2013/08/Strategy-Pattern.png
Tratarea exceptiilor
• exceptie != bug
• Exceptiile nu sunt gandite pentru a preveni bug–urile ci situatiile de executie • Clauza catch = exception handler
anormale
• exemple:
– incercarea de a deschide un fisier pentru care s-a introdus un nume eronat.
– impartire cu 0 pt numere intregi
• conditii speciale:
– “language semantic violation”
– “program-defined errors”
56
10/12/2015
class java.lang.Throwable
• class java.lang.Error
try {
out.write(b); ...
– class java.lang.VirtualMachineError
}
• class java.lang.InternalError
catch (IOException e) {
• class java.lang.OutOfMemoryError
System.out.println("Output Error"); • class java.lang.StackOverflowError
} • class java.lang.UnknownError
finally { • class java.lang.Exception
out.close();
}
228 229
V. Niculescu - MAP 228 V. Niculescu - MAP 229
Method Summary
• Throwable fillInStackTrace() Constructor Summary
Fills in the execution stack trace. • Exception()
• Throwable getCause()
Returns the cause of this throwable or null if the cause is nonexistent or unknown. Constructs a new exception with null as its detail message.
• String getLocalizedMessage()
Creates a localized description of this throwable. • Exception(String message)
• String getMessage() Constructs a new exception with the specified detail message.
Returns the detail message string of this throwable.
• StackTraceElement[] getStackTrace() • Exception(String message, Throwable cause)
Provides programmatic access to the stack trace information printed by printStackTrace(). Constructs a new exception with the specified detail message and cause.
• Throwable initCause(Throwable cause)
Initializes the cause of this throwable to the specified value. • Exception(Throwable cause)
• void printStackTrace() Constructs a new exception with the specified cause and a detail message of
Prints this throwable and its backtrace to the standard error stream.
• void printStackTrace(PrintStream s) (cause==null ? null : cause.toString()) (which typically contains the class and detail
Prints this throwable and its backtrace to the specified print stream. message of cause).
• void printStackTrace(PrintWriter s)
Prints this throwable and its backtrace to the specified print writer.
• void setStackTrace(StackTraceElement[] stackTrace)
Sets the stack trace elements that will be returned by getStackTrace() and printed by
printStackTrace() and related methods.
• String toString()
Returns a short description of this throwable.
57
10/12/2015
class java.lang.Exception
...
Cauza unei exceptii • class java.lang.RuntimeException
– class java.lang.ArithmeticException
– class java.lang.ArrayStoreException
– class java.lang.ClassCastException
• chained exception facility – class java.lang.IllegalArgumentException
• class java.lang.IllegalThreadStateException
• class java.lang.NumberFormatException
• Cauza unei exceptii: – class java.lang.IllegalMonitorStateException
– O alta excepotie – class java.lang.IllegalStateException
– class java.lang.IndexOutOfBoundsException
– O situatie speciala in program.
• class java.lang.ArrayIndexOutOfBoundsException
• class java.lang.StringIndexOutOfBoundsException
• "chain" of exceptions … – class java.lang.NegativeArraySizeException
– class java.lang.NullPointerException
– class java.lang.SecurityException
– class java.lang.UnsupportedOperationException
233
V. Niculescu - MAP 232 V. Niculescu - MAP 233
– checked,
– unchecked (RuntimeExceptions)
234
V. Niculescu - MAP 234 V. Niculescu - MAP 235
58
10/12/2015
237
V. Niculescu - MAP 236 V. Niculescu - MAP 237
Generare Exceptii
public class ThrowExample {
void doIt() throws WrongDayException{
• Instructiunea throw este folosita pentru a creea si a arunca o int dayOfWeek =(new
exceptie. – obiectul “aruncat” trebuie sa fie o instanta a unei subclase java.util.Date()).getDay();
a clasei Throwable. if (dayOfWeek != 2 && dayOfWeek != 4)
throw new WrongDayException("Tue. or
• Uzual : crearea unei clase specifice problemei de semnalat, derivate Thur.");
din clasa Exception. // The rest of doIt's logic goes here
System.out.println("Did it");
}
Example: public static void main (String [] argv) {
try {
class WrongDayException extends Exception { (new ThrowExample()).doIt();
public WrongDayException () {} } catch (WrongDayException e) {
public WrongDayException(String msg) { System.out.println("Sorry, can do it
super(msg); only on "
+ e.getMessage());
} }
} }
}
238 239
V. Niculescu - MAP 238 V. Niculescu - MAP 239
59
10/12/2015
60
10/12/2015
Exemplu
Crearea propriilor exceptii using System;
public class MyCustomException :
catch (MyCustomException e)
{
System.ApplicationException Console.WriteLine(‘‘\nMyCustomException! Msg:
{ {0}’’,
public MyCustomException(string message): e.Message);
base(message) Console.WriteLine(‘‘\nHelpLink: {0}\n’’,
{} e.HelpLink);
• Se recomanda ca acestea sa fie derivate din System.ApplicationException, care este } }
derivata direct din System.Exception. public class Test catch
{ {
public static void Main( ) Console.WriteLine(‘‘Unknown exception caught’’);
• Se indica aceasta derivare deoarece astfel se face distinctie ıntre exceptiile aplicatie { }}
si cele sistem (cele aruncate de catre CLR). Test t = new Test( ); public double DoDivide(double a, double b)
t.TestFunc( ); { if (b == 0)
} { DivideByZeroException e = new
public void TestFunc( ) DivideByZeroException( );
{ try { e.HelpLink= ‘‘http://www.greselifatale.com’’;
double a = 0; throw e;
double b = 5; }
Console.WriteLine (‘‘{0} / {1} = {2}’’, a, b, DoDivide(a,b)); if (a == 0)
Console.WriteLine (‘‘This line may or may not print’’); { MyCustomException e = new MyCustomException(
} ‘‘Can’t have zero divisor’’);
catch (System.DivideByZeroException e) e.HelpLink =
{ ‘‘http://www.greselifatale.com/NoZeroDiviso
r.htm’’;
Console.WriteLine(‘‘DivideByZeroException! Msg: {0}’’, throw e;
e.Message); }
Console.WriteLine(‘‘HelpLink: {0}’’, return a/b;
V. Niculescu - MAP 244 e.HelpLink); V. Niculescu
} - MAP 245
}
61
10/12/2015
• In Java, programatorii trebuie sa declare ca o metoda poate arunca o exceptie si sa • O problema importanta legata de exceptiile verificate este faptul ca se restringe
o declare explicit astfel incat un apelant sa stie ca se poate se poate astepta la dezvoltarea claselor derivate la suprascrierea metodei folosind doar lista de
primirea ei. exceptii specificata pentru metoda clasei de baza.
In Java:
• Aceasta cunoastere in avans permite conceperea unui plan de lucru cu fiecare
dintre ele, preferabil decat sa se prinda oricare dintre ele cu un catch generic. interface Movie{
void Enjoy() throws PeopleTalkingException;
}
• In cazul .NET se sugereaza sa se mentina o documentatie cu exceptiile care pot fi
Implementarile metodei Movie.Enjoy( ) pot sa nu arunce nici o exceptie dar daca
aruncate de fiecare metoda. arunca atunci singurul tip de exceptii verificate este PeopleTalkingException.
• Avantaj : orice cod care foloseste interfata Movie si care trateaza exceptii de tip
PeopleTalkingExceptionse este garantata sa continue sa functioneze indiferent de
cum este aceasta interfata implementata.
• Dezavantaj: uneori presupunerea initiala despre ce constituie o exceptie valida
este eronata.
• Sa presupunem ca dorim sa implementam o interfata HomeMovie public class A{ • The derived class constructor
specializata, unde oamenii pot vorbi tot ceea ce doresc , dar atunci suna public A() throws Exceptie1{ have to specifies all the
} exceptions thrown by the base
telefon sa se creeaze o circumstanta de exceptie.
public A(int i){ } class constructor.
//...
• In Java este necesar: }
public class B extends A{ • The derived class constructor may
– Sa se rescrie specificatia exceptiilor interfetei de baza
public B() throws Exceptie1{ } throw new other exceptions.
– sa se deriveze PhoneRingingException din PeopleTalkingException, public B(int i){
super(i);
}
public B(char c) throws Exceptie1,
ExceptieNoua{
}
//...
}
62
10/12/2015
• “macro processor” • Java generics furnizeaza la momentul compilarii type safety si elimina necesitatea
• oridecate ori se instantiaza cu un tip concret, intregul cod este reprodus si compilat. operatiilor cast.
• daca a mai fost instantiat, doar linkeditorul poate sesiza si indeparta (uneori) • Avantaj: erorile sunt evidentiate atunci la dezvoltare (compile time).
problema(duplicarea)
• Generics folosesc o tehnica numita type erasure.
63
10/12/2015
Nod<E> varf;
//...
}
64
10/12/2015
Bounded Wildcards
65
10/12/2015
• sau explicit:
– NumeClasa.<Tip>numeMetoda([parametrii]);
– obiect.<Tip>numeMetoda([parametrii]);
66
10/12/2015
• In ambele metode containsAll si addAll, parametrul de tip T este folosit doar o data.
class Collections {
• Tipul returnat nu depinde de parametrul de tip si nici alt argument al metodei nu depinde de public static <T> void copy(List<T> dest, List<? extends T> src){...}
acesta. }
67
10/12/2015
Collections Framework
Exemplu: http://www.vincehuston.org/dp/iterator.html Interface Hierarchy
problema? Ce returneaza next() pentru MapTraverser (values…)
• java.util.Comparator<T>
• java.util.Enumeration<E>
• java.util.EventListener
• java.util.Formattable
• java.lang.Iterable<T>
– java.util.Collection<E>
• java.util.List<E>
• java.util.Queue<E>
• java.util.Set<E>
– java.util.SortedSet<E>
• java.util.Iterator<E>
– java.util.ListIterator<E>
• java.util.Map<K,V>
– java.util.SortedMap<K,V>
• java.util.Map.Entry<K,V>
• java.util.Observer
• java.util.RandomAccess
java.util java.lang
Interface Iterator<E> Interface Iterable<E>
• Implementing this interface allows an object to be the target of the "foreach" statement.
• Methods
– boolean hasNext()
Returneaza true daca nu mai sunt elemente de iterat. • Iterator<E> iterator()
– E next() Returns an iterator over a set of elements of type E.
Returneaza elementul curent si cursorul se muta o pozitie.
– void remove()
Sterge din colectia iterata, ultimul element care a fost iterat .
(optional operation).
68
10/12/2015
Interface RandomAccess
• Marker interface used by List implementations to indicate that they support fast (generally
constant time) random access
69
10/12/2015
Exception Conventions
O analiza a performantei operatiilor in liste
• Methods or constructors that accept elements to be added to the current collection throw
ClassCastException if the element is not of an appropriate type for the collection.
• Methods or constructors that accept elements to be added to the current collection throw
IllegalArgumentException if the element’s value is not appropriate for the collection
– for example, some collections, such as subsets, define restricted ranges on the values of the
elements allowed in the collection.
Loops
Exemplu
70
10/12/2015
Example:
writing a routine that prints out all the elements in a collection
With Arrays
• Conventional
• A naive attempt at writing it using generics • Using the enhanced for statement:
(and the new for loop syntax):
public int sumArray(int array[]) {
void printCollection(Collection<Object> c) { int sum = 0;
for (Object e : c) { for(int i : array) { sum += i; }
System.out.println(e);} return sum;
} }
• However, note that the wrapper class, Integer for example, must be used as a generic type: for(T object : objects) {
theCollection.add(object);
List<Integer> list = new ArrayList<Integer>(); }
}
71
10/12/2015
/**
* Create an Object {@link List} from the supplied objects. CURS 7
* @param objects The objects to be added to the list.
* @return The {@link List}.
*/
public static <T> List<T> toList(T... objects) {
List<T> theSet = new ArrayList<T>();
addToCollection(theSet, objects);
return theSet;
}
/** • Generics in C#
* Create an Object {@link Set} from the supplied objects.
* @param objects The objects to be added to the set.
* @return The {@link Set}.
*/
}
}
• Permit crearea de clase type-safe fara a se afecta • In .NET generics au suport nativ in IL (intermediate language) si in CLR.
– performanta, ori
– productivitatea.
• Atunci cand se compileaza cod-server generic, compilatorul il traduce in IL, ca pe
• Se implementeaza server code once as a generic server. orice alt tip.
– Totusi, codul IL contine doar parametrii(place holders) pentru tipurile specifice
public class Stack<T>
{ actuale.
T[] m_Items;
public void Push(T item) • metadata codului server generic contine informatie generica.
{...}
public T Pop()
{...} • client-side compiler foloseste metadatele pentru a asigura type safety.
} – atunci cand clientul furnizeaza un tip specific, client's compiler substituie
Stack<int> stack = new Stack<int>();
parametrul generic din metadate cu tipul argument actual.
stack.Push(1);
stack.Push(2); – astfel client compiler poate forta parametrii corecti, verificari de tip...
int number = stack.Pop();
72
10/12/2015
T Find(K key)
{...}
public T this[K key]
{
get{return Find(key);}
}
}
73
10/12/2015
• System.Collections • IEnumerable este interfata de baza pentru toate colectiile non-generice care pot fi
enumerate.
• System.Collections.Generic
• Versiunea generica a acestei clase este
System.Collections.Generic.IEnumerable<T>.
74
10/12/2015
ResetSets the enumerator to its initial position, which is before the first element in the
collection. (Inherited from IEnumerator.)
• Implementarea explicita se obtine prin calificarea numelui de metoda cu • C# nu furnizeaza toata functionalitatea pe care C++ templates le furnizeaza.
numele interfetei: • Nu se pot folosi parametrii de tip constanta (int i).
• Nu se poate face implementare specializata (in functie de tip – particularizare)
System.Collections.IEnumerator
System.Collections.IEnumerable.GetEnumerator()
{ • La nivel de implementare, principala diferenta este ca in C# informatiile despre
return new MyIterator(v, a); tipul generic este pastrata in obiectele instantiate.
}
public System.Collections.Generic.IEnumerator<T> GetEnumerator()
{
return new MyIterator(v, a);
}
75
10/12/2015
• InputStream, Reader
– Operatii I/O
– Serializare • OutputStream, Writer
76
10/12/2015
Tipuri de OutputStream
• Iesire poate fi: un sir de octeti (nu String), un fisire, ori un “pipe.”
Decorator
• Intentie
Atasare de noi responsabilitati unui obiect in mod dinamic.
Decorator furnizeaza o alternativa a extinderii functionalitatii prin derivare
directa.
• Decorator sau Wrapper
• Aplicabilitate
77
10/12/2015
78
10/12/2015
readBoolean():boolean
write(byte[] )
readChar(): char
write(b:byte[] , off: int off, len: int)
readByte() : byte
write(int)
readDouble(): double
DataInputStream writeBoolean(boolean) DataOutputStream
readFloat(): float
writeByte(int )
readFully(b; byte[])
writeBytes(String )
readFully(b; byte[],off: int, len: int)
writeChar(int )
readInt(): int
writeChars(String )
readLine(): String
writeDouble(double)
readLong(): long
writeFloat(float )
readShort(): short
writeInt(int )
readUnsignedByte(): int
writeLong(long )
readUnsignedShort(): int
writeShort(int )
readUTF() :String
writeUTF(String )
skipBytes(int) :int
79
10/12/2015
• The null character '\u0000' and characters in the range '\u0080' to '\u07FF' are
Modified UTF-8 represented by a pair of bytes:
Bit Values
• Implementarile interfetelor DataInput si DataOutput folosesc • char values in the range '\u0800' to '\uFFFF' are represented by three bytes
reprezentari Unicode pentru strings intr-un format putin modificat
fata de UTF-8. Bit Values
• Toate caracterele din intervalul '\u0001' to '\u007F' sunt Byte 2 1 0 bits 11-6
representate pe un singur byte.
Byte 3 1 0 bits 5-0
• The differences between this format and the standard UTF-8 format are the
following:
– The null byte '\u0000' is encoded in 2-byte format rather than 1-byte, so
that the encoded strings never have embedded nulls.
Bit Values
– Only the 1-byte, 2-byte, and 3-byte formats are used.
Byte 1 0 bits 6-0 – Supplementary characters are represented in the form of surrogate pairs.
Example
Ierarhiile Reader & Writer
FileInputStream in = null; FileOutputStream out = null;
try {
in = new FileInputStream(“fisier.txt");
• Sunt orientate pe caractere
out = new FileOutputStream(“fisier2.txt");
int c;
while ((c = in.read()) != -1) { • Cel mai impotant motivul pentru crearea ierarhiilor Reader si Writer
out.write(c);
internationalizarea.
} catch(IOException e){
System.err.println(“Error ”+e); • Clasele din ierahiile InputStream si OutputStream suporta doar
}finally { steam-uri orientate pe 8-biti si nu pot sa lucreze cu caractere Unicode (16
if (in != null) biti).
try {
in.close(); • Aproape toate clasele de tip stream orientate pe octeti au corespondente
} catch (IOException e){ System.err.println(" Error "+e);} clase orientate pe caractere derivate din Reader respectiv Writer.
if (out != null)
try {
out.close();
} catch (IOException e) { System.err.println(" Error "+e);}
} V. Niculescu - MAP 325 V. Niculescu - MAP 326
80
10/12/2015
81
10/12/2015
// 4. File output
try { // 5. Storing & recovering data
try {
BufferedReader in4 = DataOutputStream out2 = new DataOutputStream(
new BufferedReader( new BufferedOutputStream(
new FileOutputStream("Data.txt")));
new StringReader(s2));
PrintWriter out1 = out2.writeDouble(3.14159);
new PrintWriter( out2.writeUTF("That was pi\n");
new BufferedWriter( out2.writeBytes("That was pi\n");
//For every character in the string, taken in order, one byte is written.
new FileWriter("IODemo.out"))); //The high-order eight bits of each character in the string are ignored
out2.writeDouble(1.41413);
out2.writeUTF("Square root of 2");
int lineCount = 1; out2.close();
while((s = in4.readLine()) != null ) DataInputStream in5 = new DataInputStream(
out1.println(lineCount++ + ": " + s); new BufferedInputStream(
out1.close(); new FileInputStream("Data.txt")));
// Must use DataInputStream for data:
} System.out.println(in5.readDouble());
catch(IOException e) { // Only readUTF() will recover the Java-UTF String properly:
System.err.println(e.getMessage()); System.out.println(in5.readUTF());
} System.out.println(in5.readUTF());//?!!
System.out.println(in5.readDouble());
System.out.println(in5.readUTF());
} catch(EOFException e) {
System.err.println("End of stream");
}
82
10/12/2015
import java.io.*;
Serializarea obiectelor
class App{
public static void main(String args[]) throws IOException{
FileReader f = null;
try{ • Persistenta = durata de viata a unui obiect nu e determinata de executia
f = new FileReader(“App.java”); unui program, obiectul “traieste” si intre doua executii ale programului
StreamTokenizer st= new StreamTokenizer(f);
st.parseNumbers();
int x; double v; • Serializarea obiectelor permite implementarea “lightweight persistence”
while( (x = st.nextToken()) != StreamTokenizer.TT_EOF) (obiectele pot fi usor stocate si incarcate).
{ if (x == StreamTokenizer.TT_NUMBER)
{ v = st.nval; • In Javas serializarea obiectelor permite transformarea unui obiect ce
System.out.println(v); implementeaza interfata Serializable intr-o secventa de octeti care poate fi
} ulterior retransformsta in obiectul initial.
else System.out.println(st.sval);
}
}//try • Mecanismul de serializare permite compensarea diferentelor existente intre
catch(IOException e){ diferite sisteme de operare.
System.out.println("****"+e.getMessage());
}//catch
finally{ if (f != null) f.close();}
}//main
}//:~
83
10/12/2015
try{
FileOutputStream fileOut = new FileOutputStream(“Names”);
ObjectOutputStream out = new ObjectOutputStream(fileOut); Reguli
ArrayList l = new ArrayList(); Name n =new Name(“Pop”);
l.add(n);
l.add(new Name(“Marin”));
• Campurile statice nu se salveaza pe stream.
out.writeObject(n); out.writeObject(l);
fileOut.close()
• Campurile “transient” nu se salveaza pe stream.
FileInputStream fileIn = new FileInputStream(“Names”);
ObjectInputStream in = new ObjectInputStream(fileIn);
n = (Name) in.readObject(); • Cand un obiect de tip Name este deserializat, campurile “transient” vor
l = (ArrayList) in.readObject();
if (n.equals( (Name)l.get(0)) System.out.println(“acelasi”); avea valori implicite corespunzatoare tipurilor lor.
fileIn.close();
}//try
• Un obiect este scris doar o data.
catch(NotSerializableException e){
System.out.println(“Obiect neserializabil”);
}
catch(ClassNotFoundException e){
System.out.println(e);
}
84
10/12/2015
Alte optiuni C#
Standard I/O Streams
• Functionalitatea :
– creare, stegere, redenumire, mutare de fisiere sau directoare,
– listarea continutului unui director,
– listarea atributelor, etc.
85
10/12/2015
Metode ale clasei File Clase folosite pentru citirea si scrierea datelor
Tipuri de stream-uri
Clase Decorator care sunt folosite pentru a adauga dinamic responsabilitati in plus
stream-urilor precum:
1. CryptoStreams can encode and decode any other streams, whether those streams
originate in memory, the file system, or over a network.
2. BufferedStreams improve the performance of most stream scenarios
by reading and writing bytes in large chunks, rather than one at a time.
86
10/12/2015
Clasa MemoryStream
FileMode
• Un MemoryStream preia datele din memorie, care este vazuta ca un vector de octeti.
• Exista sapte constructori grupatiın doua categorii.
• Exemplu 2 :
byte[] b = {1, 2, 3, 4};
MemoryStream mem = new MemoryStream(b);
• Exemplu 2 :
using System;
using System.IO;
public class MemTest
{
public static void Main()
{
MemoryStream mem = new MemoryStream();// scrie intr–un tablou redimensionabil
byte[] bs = {1, 2, 3, 4, 5, 6};
mem.Write(bs, 0, bs.Length);
mem.Seek(3, SeekOrigin.Begin);
byte b = (byte)mem.ReadByte();
Console.WriteLine(‘‘Value: {0}’’, b.ToString());
//se va afisa 4
}
V. Niculescu - MAP 353 } V. Niculescu - MAP 354
87
10/12/2015
• Se foloseste pentru a asigura o zona tampon in cazul opera¸tiilor I/O. • Cele doua clase sunt folosite pentru a accesa date mai complexe decat un byte: de
• Constructorul acestei clase primeste o instanta a clasei Stream. exemplu, pentru manipularea datelor de tip boolean, sau Decimal, sau int cu semn
• Exemplu: pe 64 de biti.
FileStream fs = new FileStream(@’’c:\temp\a.dat’’, FileMode.Open);
BufferedStream bs = new BufferedStream(fs); • Clasa BinaryWriter are o metoda
Write()
supraincarcata, care poate fi apelata pentru scrierea diferitelor tipuri de date.
• Important sa se foloseasca metoda Flush(), care forteaza golirea bufferului asociat
stream–ului. • Pt scrierea de string–uri si de caractere / vectori de caractere: caracterele pot fi
codificate in mai multe moduri (ex: ASCII, UNICODE, UTF7, UTF8), codificare
care se poate transmite ca argument pentru constructor.
88
10/12/2015
• C# foloseste metodele • Pentru ca o clasa definita de utilizator sa suport serializarea, este nevoie de a preciza atributul
[Serializable] ın fata declaratiei clasei respective,
– Serialize() – Atributul este definit ın clasa System.SerializableAttribute.
• Tipurile primitive sunt automat serializabile,
– Deserialize()
• Daca tipul definit de utilizator contine atribute de alte tipuri, atunci acestea la randul lor trebuie sa
ale clasei BinaryFormatter. poata fi serializate.
using System;
• Metoda Serialize() are 2 parametri: [Serializable]
– un stream in care sa scrie public class BookRecord
{
– obiectul pe care sa il serializeze. public String title;
public int asin;
public BookRecord(String title, int asin)
• Metoda de deserializare cere doar un stream din care sa citeasca si din care sa {
refaca un object (care poate fi convertit la tipul corespunzator). this.title = title;
this.asin = asin;
}
}
89
10/12/2015
Atribute Serializarea
Operatii la deserializare
Date tranziente Interfata IDeserializationCallback -> metoda OnDeserialization
using System;
using System.Runtime.Serialization;
• campuri ale unui obiect care nu se vor salva: [Serializable]
public class BookRecord: IDeserializationCallback
– parola unui utilizator, {
– numarul de cont al unui client, etc. public String title;
public int asin;
[NonSerialized] public int sales_rank;
• Acest lucru se face specificand atributul public BookRecord(String title, int asin)
{
[NonSerialized] this.title = title;
this.asin = asin;
pentru campul respectiv. sales_rank = GetSalesRank();
}
public int GetSalesRank()
• Exemplu: {
[NonSerialized] int secretKey; Random r = new Random();
return r.Next(5000);
}
public void OnDeserialization(Object o)
{
sales_rank = GetSalesRank();
}
}
V. Niculescu - MAP 367 V. Niculescu - MAP 368
90
10/12/2015
91
10/12/2015
92
10/12/2015
93
10/12/2015
cantitatea.
4. La incheierea introducerii 5. Calculeaza si afiseaza suma totala.
produselor Casierul indica casei de Refund Purchased Items
marcat finalizarea Vanzarii.
6. Casierul informeaza Clientul despre
suma totala.
7. Clientul alege modul de plata: SystemAdministrat
Manage Users
Plata Cash
b) Daca se alege Plata Credit se Start Up
Manager
initiaza Plata Credit
c) Daca se alege Plata Chec se initiaza
Plata Check
94
10/12/2015
– relatiile genereaza
– ordinea lor
– etc. – evenimentelr intersistem
95
10/12/2015
• Creare de diagrame de interactiune separate pentru fiecare operatie O solutie logica bazata pe paradigma OO
sistem.
• Pentru fiecare eveniment sistem se creeaza o diagrama cu mesajul de
start acel eveniment. • Diagrame de interactiune UML :
• Daca o diagrama devine prea complexa se imparte in mai multe. − secventa
• Se folosesc responsabilitatile si postconditiile descrise in contracte − colaborare
si descrierile cazurilor de utilizare, ca punct de plecare.
• Se aplica sabloanele GRASP si alte sabloane pentru a se ajunge la message()
:A :B
un bun design.
message1()
• Se creaza diagrama de clase (simultan).
message2()
96
10/12/2015
Exemplu
Diagrame de Colaborare
1: message1()
message() :A :B
2: message2()
• Sintaxa unui Mesaj
return:= message (par: parType):returnType
• Mesaj spre “this”
1: msg1()
message()
:A
Sintaxa Sintaxa
sales:Sales
97
10/12/2015
Exemplul 1 Exemplul 2
GRASP Expert
• Responsabilitate = Un contract sau obligatie a unui tip ori clasa
Problema: Care este principiul de baza prin care sunt atribuite responsabilitatile in
• Metodele sunt implementate pentru indeplini responsabilitatile proiectarea OO?
Solutie: Atribuie responsabilitatea expertului care detine informatia - clasa care are
• General Responsibility Assignment Software Patterns GRASP informatia necesara pentru a indeplini responsabilitatea.
Exemplu: Cine ar trebui sa fie responsabil pentru calcularea sumei totale a unei
– Expert vanzari?
– Creator 1:*[for each] sli:=next( )
t:=total()
– High Cohesion : Sale
98
10/12/2015
2: addPayment(p) p : Payment
: POST : Sale
99
10/12/2015
100
10/12/2015
• Creste potentialul de refolosire a componenetelor. • Creare de diagrame de interactiune separate pentru fiecare operatie
sistem.
• Pentru fiecare eveniment sistem se creeaza o diagrama cu mesajul de
– O proiectare bazata pe interfata–ca-si-controlor reduce oportunitatea start acel eveniment.
de a reutiliza nivelul domeniu in viitor deoarece acesta este legat de o
• Daca o diagrama devine prea complexa se imparte in mai multe.
interfata particulara.
• Se folosesc responsabilitatile si postconditiile descrise in contracte
si descrierile cazurilor de utilizare, ca punct de plecare.
• Se poate analiza starea unui caz de utilizare; operatiilor sistem • Se aplica sabloanele GRASP si alte sabloane pentru a se ajunge la
pot fi fortate sa apara in ordinea legala. un bun design.
101
10/12/2015
: subtotal(){
: return quantity* spec.price();
ProductSpecification SalesLineItem
}
102
10/12/2015
• Vizibilitatea indirecta este aceptata! Callbacks • Mediaza legatura dintre interfata si nivelul domeniu/aplicatie.
• Folosirea sablonului Observer/ Publish-Subscribe
Responsabilitati:
• POSTFrame poate avea vizibilitate la obiectele domeniu cum sunt POST, – Deschide ferestrele si afiseaza informatia din obiectele domeniu
Sale. – Gestioneaza tranzactiile
– Raspunde la evenimentele primite de la interfata
• Obiectele POST si Sale vor ignora existenta ferestrei; nu sunt instructiuni – Mapeaza informatia intre obiecetele domeniu si cele interfata
in metodele din POST and Sale legate de afisare si de logica afisarii. – Permite abilitatea de a avea mai multe ferestre care afiseaza simultan
informatia unui singur model (nivel domeniu)
• O clasa EventManager (Pure-Fabrication) poate fi utilizata pe post de – Notifica ferestrele dependente cand informatia din model se schimba si
intermediar intre model si vederi. cand ferestrele trebuie sa-si actualizeze informatia afisata.
103
10/12/2015
• Diagrama de clase se creeaza in paralel cu diagramele de interactiune • Pentru ca un obiect A sa trimita un mesaj la un obiect B,
B trebuie sa fie vizibil pentru A.
• Diagrama de clase ilustreza:
– clasele, asocierile, atributele, • 4 moduri de obtinere a vizibilitatii:
– interfetele, cu operatiile si constantele lor, – Vizibilitatea Atribut: B este un atribut al lui A;
– metodele, – Vizibilitatea Parametru: B este parametru a unei metode a lui A;
– Tipurile atributelor, – Vizibilitatea Locala: B este declarat ca obiect local intr-o metoda a
– navigabilitatea (directia vizibilitatii unui atribut), clasei lui A;
– Dependentele (indica vizibilitatea de tip non-atribut). – Vizibilitatea Globala: B este intr-un anume mod vizibil global.
Cateva reguli
Curs 10
• Clasele se gasesc din diagramele de interactiune.
• Metodele de acces (set, get) pot fi omise – atunci cand toate atributele sunt
“private” si exista metode set si get pentru fiecare dintre acestea.
104
10/12/2015
JFC si Swing
• Caracteristici:
– The Swing Components
– Pluggable Look and Feel Support
Se pot alege diferite “looks and feels”.
– Separare a datelor de modele
– ...
• Pachete:
– javax.swing
– javax.swing.event
– ...
105
10/12/2015
MVC:
• The model stores the data/ Modelul stocheaza datele.
• The view creates the visual representation from the data in the
model./
Vederea creeaza reprezentarea grafica
• The controller deals with user interaction and modifies the model
and/or the view/ controlorul gestioneaza interactiunea M-V
• Swing- MicroMVC
a collection of model/view/controller triads, each responsible for a
different GUI element.
Examples
• The Swing GUI system models almost all interface components as
individual MVC systems.
431
V. Niculescu - MAP 431 V. Niculescu - MAP 435
106
10/12/2015
Ierarhia containerilor
Exemplu - implementare
• Top-level container
• Intermediate container (panel): import javax.swing.*;
JPanel, JScrollPane, JTabbedPane) import java.awt.*;
import java.awt.event.*;
• Atomic components
public class SwingApplication {
...
• Diagrama ierarhiei pentru exemplu (SwingApplication). public static void main(String[] args) {
...
JFrame frame = new JFrame("SwingApplication");
//...create the components to go into the frame...
//...stick them in a container named contents...
frame.getContentPane().add(contents,
BorderLayout.CENTER);
107
10/12/2015
JButton button = new JButton("I'm a Swing button!"); JPanel pane = new JPanel();
button.addActionListener(...create an action listener...);
pane.setBorder(
BorderFactory.createEmptyBorder(
• 30, 30, 10, 30));
...//where instance variables are declared:
private static String labelPrefix =
pane.setLayout(new GridLayout(0, 1));
"Number of button clicks: "; pane.add(button);
private int numClicks = 0;
pane.add(label);
...//in GUI initialization code:
final JLabel label = new JLabel(labelPrefix + "0 ");
108
10/12/2015
• Aliniamente
Container contentPane = getContentPane();
– setAlignmentX setAlignmentY //contentPane.setLayout(new BorderLayout()); //unnecessary
getAlignmentX getAlignmentY contentPane.add(new JButton("Button 1 (NORTH)"),
BorderLayout.NORTH);
Spatiu intre componente contentPane.add(new JButton("2 (CENTER)"),
• Trei factori:: BorderLayout.CENTER);
contentPane.add(new JButton("Button 3 (WEST)"),
– Layout manager BorderLayout.WEST);
– Componente invisibile contentPane.add(new JButton("Long-Named Button 4 (SOUTH)"),
– Margini BorderLayout.SOUTH);
contentPane.add(new JButton("Button 5 (EAST)"),
BorderLayout.EAST);
V. Niculescu - MAP 444 V. Niculescu - MAP 445
FlowLayout GridLayout
• FlowLayout implicit pentru JPanel. • .
109
10/12/2015
Event Handling • Fiecare eveniment este reprezentat de un obiect care furnizeaza informatie
despre eveniment si sursa acestuia.
Act that results in the event Listener type • Sursele sunt in general componente.
User clicks a button, presses Return ActionListener • Fiecare sursa de evenimente poate avea inregistrati mai multi “listeners”.
while typing in a text field, or chooses • Un singur listener poate fi inregistrat pentru mai multe surse.
a menu item
User closes a frame (main window) WindowListener
User presses a mouse button while the MouseListener
cursor is over a component
User moves the mouse over a MouseMotionListener
component
Component becomes visible ComponentListener
Component gets the keyboard focus FocusListener
Table or list selection changes ListSelectionListener
MouseEvent
• Inregistrare: furnizeaza informatii despre pozitia mouse-ului, numar de click-
someComponent.addActionListener( uri, etc.
instanceOfMyClass)
110
10/12/2015
Exemplu (ActionEvent)
Evenimente “low-level” si semantice
Object
• Evenimente
java.util.EventObject – Low-level: window-system occurrences, low-level input,
java.awt.AWTEvent – Semantice toate celelalte.
• Exemple:
java.awt.event.ActionEvent
– mouse, key, component, container, focus, and window events.
– action events, item events, list selection events.
ActionEvent
• Recomandare!!!!
+getActionCommand():String
+setActionCommand(String) Tratati evenimentele semantice daca e posibil nu ecele “low-level”!
+getSource():Object
• Component listener
button.addActionListener(new ActionListener() {
– Schimbari de marime, pozitie si vizibilitate public void actionPerformed(ActionEvent e) {
• Focus listener numClicks++;
label.setText(labelPrefix + numClicks);
• Key listener }
});
...
• Mouse listener frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
• Mouse motion listener System.exit(0);
}
});
111
10/12/2015
112
10/12/2015
SwingApplication-(2)
SwingApplication-(1)
button.addActionListener(new ActionListener() {
import javax.swing.*; public void actionPerformed(ActionEvent e) {
import java.awt.*; numClicks++;
import java.awt.event.*; s=new String(text.getText());
label.setText(labelPrefix + numClicks+ s );
public class SwingApplication { }
private static String labelPrefix = });
"Number of button clicks:";
private int numClicks = 0; label.setLabelFor(button);
private String s="";
JPanel pane = new JPanel();
public Component createComponents() {
final JLabel label = new JLabel(labelPrefix + "0 "); pane.setBorder(
BorderFactory.createEmptyBorder(20, 20, 50, 40) );
final JTextField text = new JTextField("cliks", 20); pane.setLayout(new GridLayout(3, 1));
pane.add(button);
JButton button = new JButton("I'm a Swing button!"); pane.add(label);
button.setMnemonic('i'); pane.add(text);
return pane;
}
V. Niculescu - MAP 460 V. Niculescu - MAP 461
113
10/12/2015
114
10/12/2015
public Actions() // Creates three radio buttons that specifies the exponent
{ grp = new ButtonGroup();
setLayout (new GridLayout(5,1,10,10));
setBackground (Color.lightGray); radioButton = new JRadioButton("One");
radioButton.addActionListener(this);
JPanel subPanel = new JPanel(); radioButton.setActionCommand("One Activated");
label1 = new JLabel("Number:"); grp.add(radioButton);
subPanel.add(label1); subPanel.add(new JLabel(""));
subPanel.add(radioButton);
// Creates a text field where the number is read
subPanel.add(label2);
field = new JTextField(10);
field.addActionListener (this); radioButton = new JRadioButton("Two");
label1.setLabelFor(field); radioButton.addActionListener(this);
subPanel.add(field); radioButton.setActionCommand("Two Activated");
add(subPanel); grp.add(radioButton);
subPanel.add(radioButton);
subPanel = new JPanel();
subPanel.setLayout(new GridLayout(3,2)); radioButton = new JRadioButton("Three");
radioButton.addActionListener(this);
label2 = new JLabel("Power:"); radioButton.setActionCommand("Three Activated");
grp.add(radioButton);
subPanel.add(new JLabel(""));
subPanel.add(radioButton);
// Creates a checkbox that specifies if the square root is computed public void actionPerformed(ActionEvent e)
subPanel=new JPanel(); { if (e.getActionCommand().equals("One Activated"))
checkBox=new JCheckBox("Square Root"); power=1;
checkBox.addActionListener(this); if (e.getActionCommand().equals("Two Activated"))
subPanel.add(checkBox); power=2;
add(subPanel); if (e.getActionCommand().equals("Three Activated"))
power=3;
subPanel=new JPanel();
// Creates a button with an icon if (e.getActionCommand().equals("Button Activated"))
buttonImage = new ImageIcon("c:/temp/qs_cons.gif"); { double rez;
button = new JButton("Compute"); try{
button.setIcon(buttonImage); rez=Integer.parseInt(field.getText());
button.addActionListener(this); rez=Math.pow(rez,power);
button.setActionCommand("Button Activated"); if (checkBox.isSelected()) rez=Math.sqrt(rez);
subPanel.add(button); fieldRez.setText((new Double(rez)).toString());
add(subPanel); }
catch(NumberFormatException ee){
subPanel=new JPanel(); JOptionPane.showMessageDialog(
label3 =new JLabel("Result"); field,"Give an integer number!","Error",
subPanel.add(label3); JOptionPane.ERROR_MESSAGE ) ;
fieldRez = new JTextField(15); field.requestFocus();
fieldRez.setEditable(false); }
subPanel.add(fieldRez); }
add(subPanel); }
}
V. Niculescu - MAP 470 V. Niculescu - MAP 471
115
10/12/2015
116
10/12/2015
Exemplu
private JButton addButton;
private JButton deleteButton;
import java.awt.*;
import java.awt.event.*; private JTextField nameField;
import javax.swing.*; private JTextArea log;
import javax.swing.event.*; static private String newline = "\n";
117
10/12/2015
//Create the text field for entering new names. //Create the log for reporting list data events.
nameField = new JTextField(15); log = new JTextArea(5, 2);
nameField.addActionListener( JScrollPane logScrollPane = new JScrollPane(log);
new AddButtonListener());
String name = listModel.getElementAt( //Create a split pane for the log and the list.
list.getSelectedIndex()).toString(); JSplitPane splitPane =
new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,
nameField.setText(name); listScrollPane, logScrollPane);
//Create a control panel (uses the default FlowLayout). JPanel panel=new JPanel();
JPanel buttonPane = new JPanel(); panel.setLayout(new BorderLayout());
panel.add(buttonPane, BorderLayout.NORTH);
buttonPane.add(nameField); panel.add(splitPane, BorderLayout.CENTER);
buttonPane.add(addButton); return panel;
buttonPane.add(deleteButton); }
118
10/12/2015
class AddButtonListener implements ActionListener { //Listener method for list selection changes.
public void actionPerformed(ActionEvent e) { public void valueChanged(ListSelectionEvent e) {
if (nameField.getText().equals("")) { if (e.getValueIsAdjusting() == false) {
//User didn't type in a name... if (list.getSelectedIndex() == -1) {
Toolkit.getDefaultToolkit().beep(); //No selection: disable delete button.
return; deleteButton.setEnabled(false);
} nameField.setText("");
int index = list.getSelectedIndex(); }
int size = listModel.getSize(); else if (list.getSelectedIndices().length > 1) {
//If no selection or if item in last position is selected, //Multiple selection: disable add button.
//add the new one to end of list, and select new one. deleteButton.setEnabled(true);
if (index == -1 || (index+1 == size)) { addButton.setEnabled(false);
listModel.addElement(nameField.getText()); }
list.setSelectedIndex(size); else {
//Otherwise insert the new one after //Single selection: permit all operations.
// the current selection, and select new one. deleteButton.setEnabled(true);
} else { addButton.setEnabled(true);
listModel.insertElementAt(nameField.getText(), index+1); nameField.setText(
list.setSelectedIndex(index+1); list.getSelectedValue().toString());
} }
} } }
}
V. Niculescu - MAP 486 V. Niculescu - MAP 487
119
10/12/2015
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e)
{System.exit(0);}
});
• Constructori
JPanel panel=frame.init();
frame.getContentPane().add(panel,"Center"); – JScrollPane()
Creaza un JScrollPane vid (fara viewport); bare de scroll
frame.setSize(panel.getPreferredSize()); orizontale si verticale apar cand este necesar.
frame.pack();
– JScrollPane(Component view)
frame.setVisible(true); Creaza a JScrollPane care afiseaza continutul componentei; bare
} de scroll orizontale si verticale apar daca componenta este mai mare.
}
Meniuri C#
• Clase:
– JMenuBar, JMenu, JMenuItem
• Exemplu
private JMenuItem addItem;
private JMenuItem deleteItem;
menub.add(menu1);
menub.add(menu2);
frame.setJMenuBar(menub);
V. Niculescu - MAP 490 V. Niculescu - MAP 491
120
10/12/2015
MVC
Curs 11 • Sablonul Model/View/Controller (MVC) este folosit in special pentru aplicatii cu
interfete utilizator.
• MVC consta in :
–Model-View-Controller Pattern
– Model defineste domeniul aplicatiei
–Observer Design Pattern
– View defineste interfata utilizator
–Publish-Subscribe Pattern – Controller defineste modul in care interactioneaza celelalte 2.
–Strategy Design Pattern
–Command Design Pattern
–Event Delegation
–Layered architectures
121
10/12/2015
122
10/12/2015
– Ori de cate ori modelul se schimba, modelul notifica vederile care depind de
ele. In urma acestei notificari fiecare vedere isi poate actualiza starea.
– Se pot de asemenea crea noi vederi pentru model fara a fi nevoie ca modelul sa
fie rescris/modificat.
• Scop
– Defineste o dependenta de tip unu-la-mai-multe intre obiecte, astfel incat atunci
cand un obiect isi schimba starea, toate obiectele dependente de el sunt
notificate si actualizate automat.
(o specializare a sablonului mai general Publish/Subscribe)
• Aplicabilitate:
– Cand o abstractizare are doua aspecte, unul depinzand de altul, incapsularea
acestor aspecte in obiecte separate ne permite sa le modificam si sa le refolosim
independent.
– Cand o modificare a unui obiect cere modificarea automata a altora si nu se
cunoaste exact cate obiecte trebuie sa fie schimbate.
– Cand un obiect trebuie sa poata sa instiinteze alte obiecte fara a cunoaste detalii
despre aceste obiecte. Cu alte cuvinte, cand nu dorim ca aceste obiecte sa fie
cuplate strans.
123
10/12/2015
Observer-Exemplu
Interactiuni Relatia Model – View
Observer in Java
Alt exemplu de folosire a sablonului Observer
• Interface Observer <<Interface>>
Observer
(from util)
void update(Observable o, Object arg)
Observable
(from util) + update()
• Class Observable
void addObserver(Observer o)
Licitatie Licitator
int countObservers() - offeredValue : Integer
- value : Integer
void deleteObserver(Observer o) - ... - ...
void deleteObservers() + update(arg0 : Observable, arg1 : Object) : void
+ setValue(v : Integer)
boolean hasChanged() + ...() + ...()
void notifyObservers()
void notifyObservers(Object arg) value=v; offeredValue:=arg1.intValue()
void setChanged() (protected) setchanged();
notifyObservers()
124
10/12/2015
• MVC permite de asemenea schimbarea modului in care o vedere raspunde inputului • Relatia View-Controller este un exemplu de folosire a sablonului de proiectare
utilizatorului fara a se schimba prezentarea vizuala. Strategy.
– Daca se doreste schimbarea modului in care sistemul raspunde la apasarea • Strategy este un obiect care reprezinta un algoritm.
tastelor (ex. jocuri: alte taste), sau folosirea unui meniu de tip pop-up in locul
tastaturii. • Este folositor
– atunci cand se doreste inlocuirea unui algoritm static sau chiar dinamic;
– MVC incapsuleaza mecanismul de raspuns intr-un obiect de tip Controller. – cand exista mai multe variante ale algoritmului,
• Se poate crea o ierarhie de clase de tip controller, aceasta facand posibila – sau atunci cand un algoritm are structuri de date complicate pe care doreste sa
simpla creare a unui nou controller ca o variatie a celui existent. le incorporeze.
• Cand mai multe clase difera doar in comportament. “Strategy” furnizeaza un mod
de a configura o clasa cu una sau mai multe functionalitati.
• Cand este nevoie de mai multe variante ale unui algoritm. “Strategy” este folosit
atunci cand aceste variante sunt implementate ca o ierarhie de clase de algoritmi.
125
10/12/2015
Strategy Example
public class Controller implements ActionListener // maybe other listeners Strategy based on Interfaces
{ public void actionPerformed(ActionEvent e){
// some action
}
….
}
public class SpecializedController extends Controller {
public void actionPerformed(ActionEvent e){
// some other action
}
//…
}
public class MyWindow extends JFrame{
private JButton buton;
private Controller ctr;
//…
public void changeResponse(Controller newCtr)
button.removeActionListener(ctr);
button.addActionListener(newCtr);
ctr=newCtr;
//…
}
//…
} V. Niculescu - MAP 512 V. Niculescu - MAP 514
126
10/12/2015
518
V. Niculescu - MAP 517 V. Niculescu - MAP 518
Publish-Subscribe Pattern
• Problema:
– O schimbare in starea (sau un eveniment) apare in Publisher si toate
obiectele care sunt dependente sau interesate de acest tip de eveniment
sunt informate (Subscribers).
– Publisher nu trebuie sa aiba cunoasterea directa a obiectelor
Subscribers asociate (cunoasterea tipului concret).
• Solutie:
– Defineste un sistem de notificare a evenimentelor, astfel incat Publisher
poate indirect sa notifice Subscriberii.
128
10/12/2015
layers
129
10/12/2015
130
10/12/2015
• Se folosesc in special pentru aplicatii care nu folosesc interfete ci folosesc • Intent: Incapsuleaza o cerere ca si un obiect,
primesc mesaje de la alte sisteme externe.
permitand parametrizarea cu diferite cereri
• Solutie: sau cozi de mesaje si permitand operatii
undo.
– Defineste un singur Controller pentru toate mesajele de tip eveniment
sistem – • Structura:
(façade controller, ori use-case type controller)
(namit MessageHandler).
Aplicabilitate
• parametrizare cu actiunea care se realizeaza;
– in limbajele procedurale aceasta se poate exprima printr-o functie callback, care este o
functie care se inregistreaza undeva pentru a fi apoi apelata la un moment ulterior.
• suporta undo;
• suporta inregistrarea schimbarilor astefl incat acestea pot fi reaplicatein cazul in care apare
system crash.
Interfata Command poate fi imbunatatita cu operatiile load si store, se poate pastra un
persistent log al schimbarilor.
131
10/12/2015
c:
Command
Intent
• The intent of this pattern is to capture the internal state of an object without violating
encapsulation and thus providing a mean for restoring the object into initial state when • In proiectarea orientata-obiect,
needed. nivel (layer) = un grup de clase care au acelasi set de dependente la nivel
de modul, la momentul legarii cu alte module
(link-time module dependencies to other modules).
132
10/12/2015
133
10/12/2015
• Middleware refera un software care conecteaza • Conceptul arhitecturii three-tier a aparut in anii 1990s din analizarea
– componente software ori sistemelor distribuite (e.g., web applications) unde nivelele prezentare,
– utilizatori de aplicatiile lor middleware si stocare se executa pe platforme diferite fizic.
Software-ul consta dintr-un set de servicii care permit mai multor procese care
se executa pe o masina sau pe mai multe, sa interactioneze • MVC apare mai inainte ( Xerox PARC 1970s - 1980s) si se bazeaza pe
(provide for interoperability) analizarea aplicatiilor care se executa o singura statie de lucru (single
graphical workstation);
– Este similar cu nivelul de mijloc din arhitectura three-tier cu exceptia Ulterior s-a extins aplicarea MVC la aplicatii distribuite.
faptului ca se intinde pe mai multe sisteme sau aplicatii (stretched
across multiple systems or applications)
Layered architecture
-domain isolation-
• Domain-Driven Design
Reference: Eric Evans. Domain-Driven Design: Tackling Complexity in the Heart of Software.
Addison-Wesley, 2003
V. Niculescu - MAP 552 V. Niculescu - MAP 553
134
10/12/2015
Application Layer
User Interface (or Presentation Layer)
• The tasks this layer is responsible for are
– meaningful to the business or
Responsible for
– necessary for interaction with the application layers of other systems.
• showing information to the user and
• interpreting the user's commands. • This layer does not contain business rules or knowledge.
The external actor might sometimes be another computer system rather than a • Responsibilities:
human user. – coordinates tasks and
– delegates work to domain objects in the next layer down.
• Responsible for : • Provides generic technical capabilities that support the higher layers.
– representing concepts of the business, • Services:
– information about the business situation, and – message sending for the application,
– business rules. – persistence for the domain,
– Drawing widgets for the UI, and so on.
• State that reflects the business situation is controlled and used here, even
though the technical details of storing it are delegated to the infrastructure. • The infrastructure layer may also support the pattern of interactions
between the four layers through an architectural framework.
135
10/12/2015
Design Rules
Remarks
• Partition a complex program into layers.
• Some projects don't make a sharp distinction between the • Develop a design within each layer that is cohesive and that depends only
– user interface layer and on the layers below.
– application layer.
• Follow standard architectural patterns to provide loose coupling to the
layers above.
• Others have multiple infrastructure layers.
• Concentrate all the code related to the domain model in one layer and
isolate it from the user interface, application, and infrastructure code.
• But the crucial separation of the domain layer enables
MODEL-DRIVEN DESIGN.
• The domain objects, free of the responsibility of displaying themselves,
storing themselves, managing application tasks, and so forth, can be
focused on expressing the domain model.
136
10/12/2015
• A Pure Fabrication is a class that does not represent a concept in the problem
domain.
• It is specially made up to achieve low coupling, high cohesion, and the reuse Curs 9
potential thereof derived (when a solution presented by the Information Expert
pattern does not).
137
10/12/2015
• Codul care poate fi apelat simultat de mai multe threaduri se numeste thread safe. • Sunt stocate pe stiva de executie a fiecarui thread.
• Daca o bucata de cod este thread safe atunci nu contine race conditions. • Prin urmare nu sunt niciodata partajate.
• Race condition apare doar atunci cand mai multe threaduri updateaza resurse – => thread safe.
partajate.
– -care sunt acestea….? public void someMethod(){
long threadSafeInt = 0;
threadSafeInt++;
}
138
10/12/2015
• Daca obiectul este folosit doar in interiorul threadului care il defineste => thread public add(String text){ public class MyRunnable implements Runnable{
safe.
this.builder.append(text); NotThreadSafe instance = null;
}
public void someMethod(){
} public MyRunnable(NotThreadSafe instance){
LocalObject localObject = new LocalObject();
this.instance = instance;
localObject.callMethod();
}
method2(localObject);
} public void run(){
public void method2(LocalObject localObject){ this.instance.add("some text");
localObject.setValue("value"); }
} }
• Daca o resursa este creata, folosita si eliminata in interiorul controlului aceluiasi • Additionally, thread signaling enables threads to wait for signals from other threads.
thread atunci folosirea acelei resurse este thread safe. • For instance, a thread B might wait for a signal from thread A indicating that data is
ready to be processed.
139
10/12/2015
• Pentru a apela wait sau notify threadul trebuie sa obtina mai intai blocarea pe acel public void doNotify(){
obiect. synchronized(myMonitorObject){
myMonitorObject.notify();
– Threadul apelant trebuie sa apeleze notify sau wait doar dintr-un bloc }
synchronized. }
}
140
10/12/2015
• Apelurile metodelor notify() si notifyAll() nu se salveaza in cazul in care nici un • Evitarea situatiei problema public void doWait(){
thread nu asteapta atunci cand sunt apelate. synchronized(myMonitorObject){
se poate face prin salvarea if(!wasSignalled){
try{
• Astfel semnalul notify se pierde. semnalelor in interiorul
myMonitorObject.wait();
clasei care le trimite. } catch(InterruptedException e){...}
• Acest lucru poate conduce la situatii in care nu thread asteapta nedefinit, pentru ca }
mesajul corespunzator de notificare se pierde. //clear signal and continue running.
wasSignalled = false;
}
}
Deadlock Example
• A deadlock is when two or more threads are blocked waiting to obtain locks that public class TreeNode { public synchronized void setParent(TreeNode
parent){
some of the other threads in the deadlock are holding. TreeNode parent = null; this.parent = parent;
List children = new ArrayList(); parent.addChildOnly(this);
}
• Deadlock can occur when multiple threads need the same locks, at the same time, public synchronized void addChild(TreeNode
but obtain them in different order. child){ public synchronized void
if(!this.children.contains(child)) { setParentOnly(TreeNode parent){
this.children.add(child); this.parent = parent;
• For instance, if thread 1 locks A, and tries to lock B, and thread 2 has already child.setParentOnly(this); }
} }
locked B, and tries to lock A, a deadlock arises.
}
– Thread 1 can never get B, and thread 2 can never get A. In addition, neither of
them will ever know. public synchronized void
addChildOnly(TreeNode child){
– They will remain blocked on each their object, A and B, forever. if(!this.children.contains(child){
this.children.add(child);
}
Thread 1 locks A, waits for B }
Thread 2 locks B, waits for A
141
10/12/2015
• Daca unui thread nu I se aloca timp de executie CPU time pentru ca alte threaduri
folosesc CPU atunci exista o situatie numita "starvation".
• Thread este "starved to death" pentru ca alte threaduri au acces la CPU in locul lui.
Curs 14
• Situatia corecta "fairness" toate threadurile au sanse egale la folosire CPU.
Reflection
142
10/12/2015
Object class
Advanced topics
• Arrays
– java.lang.reflect.Array Object
– Creating Arrays
– Accessing Arrays + Object()
– Obtaining the Class Object of an Array # Object clone()
– Obtaining the Component Type of an Array + boolean equals(Object obj)
# protected void finalize()
• Annotations
+ Class getClass()
– Class Annotations
+ int hashCode()
– Method Annotations + void notify()
– Parameter Annotations + void notifyAll()
– Field Annotations + String toString()
• Generics + void wait()
• Dynamic Proxies + void wait(long timeout)
• Dynamic Class Loading and Reloading + void wait(long timeout, int nanos)
Class<T>
java.lang.reflect
Interfaces Classes • java.lang.Class<T>
• AnnotatedElement
• GenericArrayType • AccessibleObject • Type Parameters:
• GenericDeclaration • Array – T - the type of the class modeled by this Class object. For example, the type of
• InvocationHandler
• Constructor String.class is Class<String>.
• Member
• ParameterizedType • Field – Use Class<?> if the class being modeled is unknown.
• Type • Method
• TypeVariable
• Modifier Ex.
• WildcardType
• Proxy
• ReflectPermission void printClassName(Object obj) {
Exceptions System.out.println("The class of " + obj +
• InvocationTargetException " is " + obj.getClass().getName());
• MalformedParameterizedTypeException
• UndeclaredThrowableException }
Errors
• GenericSignatureFormatError
143
10/12/2015
Implemented Interfaces
Members
• To get a complete list of the interfaces implemented by a given class you will have
to consult both the class and its superclasses recursively.
144
10/12/2015
Constructors Methods
145
10/12/2015
Drawbacks of Reflection
references
Reflection is powerful, but should not be used indiscriminately. • Tutorial:Trail: The Reflection API
http://docs.oracle.com/javase/tutorial/reflect/
If it is possible to perform an operation without using reflection, then it is preferable to
avoid using it. • Ira R. Forman and Nate Forman , Java Reflection in Action , Manning
Publications, 2004.
• Performance Overhead
– certain Java virtual machine optimizations can not be performed.
• Security Restrictions alte tutoriale...
• Exposure of Internals
– accessing private fields and methods,
– Reflective code breaks abstractions
146