This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision Next revision Both sides next revision | ||
laboratoare:static-final [2019/10/19 21:08] Adriana Draghici |
laboratoare:static-final [2019/10/20 14:51] Radu Matei [Exerciții] |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | = Static și final = | + | = Static și final; Singleton Design Pattern = |
== Obiective == | == Obiective == | ||
Line 244: | Line 244: | ||
* pentru obiecte de tip //Factory//. | * pentru obiecte de tip //Factory//. | ||
- | Exemple din API-ul Java: | + | Exemple din API-ul Java: [[http://docs.oracle.com/javase/8/docs/api/java/lang/Runtime.html | java.lang.Runtime]], [[http://docs.oracle.com/javase/8/docs/api/java/awt/Toolkit.html | java.awt.Toolkit]] |
- | * [[http://docs.oracle.com/javase/8/docs/api/java/lang/Runtime.html | java.lang.Runtime]] | + | |
- | * [[http://docs.oracle.com/javase/8/docs/api/java/awt/Toolkit.html | java.awt.Toolkit]] | + | |
Din punct de vedere al design-ului și testarii unei aplicații de multe ori se evită folosirea acestui pattern, în test-driven development fiind considerat un **//anti-pattern//**. A avea un obiect Singleton a carei referință o folosim peste tot prin aplicație introduce multe dependențe între clase și îngreunează testarea individuală a acestora. | Din punct de vedere al design-ului și testarii unei aplicații de multe ori se evită folosirea acestui pattern, în test-driven development fiind considerat un **//anti-pattern//**. A avea un obiect Singleton a carei referință o folosim peste tot prin aplicație introduce multe dependențe între clase și îngreunează testarea individuală a acestora. | ||
Line 297: | Line 295: | ||
* o constantă MAGIC_NUMBER având orice valoare doriți | * o constantă MAGIC_NUMBER având orice valoare doriți | ||
* un String constant MAGIC_STRING, lung de minim 20 de caractere, generat random | * un String constant MAGIC_STRING, lung de minim 20 de caractere, generat random | ||
- | * un constructor care primește: un String numit ''firstName'', un String numit ''lastName'' și un int numit ''age'' | + | * un constructor care primește: un String numit ''name'' |
* o metodă ''getPassword()'' care va returna parola | * o metodă ''getPassword()'' care va returna parola | ||
- | * parola se construiește concatenand următoarele șiruri: | + | * parola se construiește concatenand următoarele șiruri: |
- | * șirul format din ultimele ''(age % 3)'' litere din firstName | + | |
* un șir random de lungime MAGIC_NUMBER, generat cu ''RandomStringGenerator'' și cu un alfabet obținut din 10 caractere obținute random din MAGIC_STRING | * un șir random de lungime MAGIC_NUMBER, generat cu ''RandomStringGenerator'' și cu un alfabet obținut din 10 caractere obținute random din MAGIC_STRING | ||
- | * și șirul format prin conversia la String a numărului (age + lungimea lui lastName). | + | * și șirul format prin conversia la String a lungimii lui name + un numar intreg generat random din intervalul [0,100] |
* Pentru subșiruri și alte metode utile consultați documentația clasei [[http://docs.oracle.com/javase/8/docs/api/java/lang/String.html | String]] | * Pentru subșiruri și alte metode utile consultați documentația clasei [[http://docs.oracle.com/javase/8/docs/api/java/lang/String.html | String]] | ||
- | - (**3p**) Modificati implementarea clasei PasswordMaker astfel incat | + | - (**3p**) Modificati implementarea clasei PasswordMaker astfel incat sa respecte conceptul de **Singleton pattern** (sa permita instantierea unei singur obiect) |
- | * Sa respecte conceptul de Singleton pattern (sa permita instantierea unei singur obiect) | + | * Pornind de la exemplul de Singleton din textul laboratorului implementati o versiune care urmeaza principiul de Eager Initialization (singura instanta a clasei este creata la pornirea aplicatiei, indiferent daca este necesar sau nu) |
- | * Implementati Singleton pattern folosind conceptul de Eager Initialization (singura instanta a clasei este creata la pornirea aplicatiei, indiferent daca este necesar sau nu) | + | * Implementati o versiune de Singleton in care variabila ''instance'' este initializata intr-un bloc static |
- | * Modificati implementarea anterioara urmand conceptul de Lazy Initialization (singura instanta a clasei este creata doar atunci cand este nevoie de ea) | + | * Adaugati un contor care sa numere de cate ori a fost accesata metoda ''getInstance()''. E nevoie ca acest contor sa fie static? |
- | - (**4p**) Să se implementeze o clasă ''MyImmutableArray'' care sa contina: | + | * //Tema de gandire:// Ce se va intampla daca folosim conceptul de Singleton pattern intr-un program paralelizat, care ruleaza pe mai multe linii de executie (thread-uri). Ce probleme ar putea sa apara? |
+ | - (**3p**) Să se implementeze o clasă ''MyImmutableArray'' care sa contina: | ||
* un field de ''ArrayList<Integer> immutableArray;'' neinitializat in prima faza | * un field de ''ArrayList<Integer> immutableArray;'' neinitializat in prima faza | ||
* un constructor care primeste un ArrayList<Integer> si copiaza toate elementele din acel array in ''immutableArray'' | * un constructor care primeste un ArrayList<Integer> si copiaza toate elementele din acel array in ''immutableArray'' |