This shows you the differences between two versions of the page.
poo-ca-cd:laboratoare:static-final [2021/09/22 15:45] florin.mihalache [Exerciții] |
poo-ca-cd:laboratoare:static-final [2023/10/29 16:03] (current) calin.precupetu |
||
---|---|---|---|
Line 338: | Line 338: | ||
O clasă de tip Singleton poate fi extinsă, iar metodele ei suprascrise, însă într-o clasă cu metode statice acestea nu pot fi suprascrise (//overriden//) (o discuție pe aceasta temă puteți găsi [[http://geekexplains.blogspot.ro/2008/06/can-you-override-static-methods-in-java.html | aici]], și o comparație între static și dynamic binding [[http://geekexplains.blogspot.ro/2008/06/dynamic-binding-vs-static-binding-in.html | aici]]). | O clasă de tip Singleton poate fi extinsă, iar metodele ei suprascrise, însă într-o clasă cu metode statice acestea nu pot fi suprascrise (//overriden//) (o discuție pe aceasta temă puteți găsi [[http://geekexplains.blogspot.ro/2008/06/can-you-override-static-methods-in-java.html | aici]], și o comparație între static și dynamic binding [[http://geekexplains.blogspot.ro/2008/06/dynamic-binding-vs-static-binding-in.html | aici]]). | ||
- | === Deep copy. Shallow copy === | + | ==== Deep copy. Shallow copy ==== |
Pentru început, ne propunem să ne familiarizăm cu noțiunea de copie în Java. | Pentru început, ne propunem să ne familiarizăm cu noțiunea de copie în Java. | ||
Line 460: | Line 460: | ||
} | } | ||
</code> | </code> | ||
- | |||
==== Exerciții ==== | ==== Exerciții ==== | ||
- | - **(1 punct)** Folosind de pașii și de debugger, reparați codul din pachetul ''vault'' din cadrul [[https://github.com/oop-pub/oop-labs/tree/master/src/lab4 | scheletului laboratorului]] (același care este prezentat în cadrul tutorialului de debug). | + | - Pentru a rezolva laboratorul aveti urmatorul contest pe LambdaChecker : [[https://beta.lambdachecker.io/contest/55/problems?page=1 | contest]] |
- | - Aveți de implementat o mini aplicație de tip queries dintr-o bază de date cu studenți și cu profesori. Fiecare student are o colecție de asocieri dintre materiile sale și notele la materiile respective de tip dicționar, iar fiecare profesor are o listă de materii pe care le predă. Studenții pot executa operații care sunt doar read-only (acestea nu pot avea efecte de tip write în baza de date - hint: imutabilitate) și profesorii pot executa operații de tip read-write. | + | - **(0 puncte)** Folosind pașii de mai sus și debugger-ul, reparați codul din pachetul ''vault'' din cadrul [[https://github.com/oop-pub/oop-labs/tree/master/src/lab4 | scheletului laboratorului]] (același care este prezentat în cadrul tutorialului de debug). |
- | - **(1 punct)** Având la bază scheletul de cod, faceți clasa Database, care se ocupă cu gestionarea bazei de date a studenților și a profesorilor, o clasă de tip Singleton (tipul de Singleton este la alegerea voastră). Această clasă va conține o listă de profesori și o listă de studenți. Faceți aceste liste de tip final. | + | - Aveți de implementat o mini aplicație de tip queries dintr-o bază de date cu dealershipuri și selleri de masini. Fiecare dealership are o colecție de asocieri dintre brandurile de masini vandute și pretul lor, de tip dicționar, iar fiecare seller are o listă de branduri de masina pe care le vinde. |
- | - **(1 punct)** Clasa ''Student'' are trei câmpuri: nume, prenume și un dicționar unde sunt stocate materiile unui student, fiecare materie fiind asociată cu nota studentului la materia respectivă. În această clasă, implementați următoarele: | + | - **(2 puncte)** Având la bază scheletul de cod, faceți clasa Database, care se ocupă cu gestionarea bazei de date a dealershipurilor și a sellerilor, o clasă de tip Singleton cu implementare de tip lazy. Această clasă va conține o listă de dealershipuri și o listă de selleri. Faceți aceste liste de tip final. |
- | - metoda ''averageGrade'', care calculează media generală a studentului (media tuturor materiile pe care acesta le are). | + | - **(1 punct)** Clasa ''Dealership'' are doua câmpuri: nume și un dicționar unde sunt stocate brandurile de masini, fiecare brand fiind asociat cu pretul sau la dealershipul respectiv. În această clasă, implementați următoarele: |
- | - copy constructor-ul clasei | + | - metoda ''averagePrice'', care calculează media pretului masinilor din Dealership. |
- | - metoda ''getGradeForSubject'', care primește ca parametru de intrare numele unei materii și întoarce nota studentului la materia respectivă. | + | - copy constructorul clasei |
- | - **(1 punct)** Clasa ''Teacher'' are trei câmpuri: nume, prenume și lista materiilor pe care ei le predau. În această clasa implementați copy constructor. | + | - metoda ''getPriceForBrand'', care primește ca parametru de intrare numele unui brand și întoarce pretul acestuia. |
+ | - **(1 punct)** Clasa ''Seller'' are doua câmpuri: nume si lista brandurilor pe care acesta le vinde. În această clasa implementați copy constructor. | ||
- **(2 puncte)** În clasa ''Database'' implementați următoarele metode: | - **(2 puncte)** În clasa ''Database'' implementați următoarele metode: | ||
- | - ''findAllStudents'' - întoarce lista de studenți | + | - ''getAllDealerships'' - întoarce lista de delaershipuri |
- | - ''findAllTeachers'' - întoarce lista de profesori | + | - ''getAllSellers'' - intoarce lista de selleri |
- | - ''getStudentsBySubject'' - primește ca parametru numele unei materii și întoarce lista cu studenții care au materia respectivă | + | - ''getDealershipByBrand'' - primește ca parametru numele unui brand și întoarce lista cu dealershipurile care detin brandul respectiv |
- | - ''findTeachersBySubject'' - primește ca parametru numele unei materii și întoarce lista cu profesorii care predau materia respectivă. | + | - ''getSellerByBrand'' - primește ca parametru numele unui brand și întoarce lista cu sellerii care vand brandul respectiv. |
- | - ''getStudentsByAverageGrade'' - întoarce lista cu studenții sortați crescător în funcție de media lor generală | + | - ''getDealershipsByAveragePrice'' - întoarce lista cu dealershipuri sortate crescător în funcție de pretul lor mediu. |
- | - ''getStudentsByGradeForSubject'' - primește ca parametru numele unei materii și întoarce lista cu studenții care au materia respectivă, sortați după nota pe care au ei la materia respectivă în ordinea crescătoare. | + | - ''getDealershipsByPriceForBrand'' - primește ca parametru numele unui brand și întoarce lista cu dealershipurile care detin acel brand, sortate după pretul acestuia în ordine crescătoare. |
- | - **(1 punct)** În clasa ''Teacher'' implementați următoarele metode, care vor apela metodele corespunzătoare din clasa ''Database'': | + | - **(1 punct)** În clasa ''Seller'' implementați următoarele metode, care vor apela metodele corespunzătoare din clasa ''Database'': |
- | - ''getAllTeachers'' | + | - ''getAllSellers'' |
- | - ''getTeachersBySubject'' | + | - ''getAllDealerships'' |
- | - ''getAllStudents'' | + | - ''getSellersByBrand'' |
- | - ''getStudentsBySubject'' | + | - ''getDealershipsByBrand'' |
- | - ''getStudentsByAverageGrade'' | + | - ''getDealershipsByAveragePrice'' |
- | - ''getStudentsByGradeForSubject'' | + | - ''getDealershipsByPriceForBrand'' |
- | - **(1 punct)** În clasa Student implementați următoarele metode, care vor apela metodele corespunzătoare din clasa ''Database'' (atenție, aici metodele trebuie să întoarcă rezultate imutabile, sub forma de deep copy, folosind modalitatea prezentată în laborator, folosind [[https://docs.oracle.com/javase/8/docs/api/java/util/Collections.html | Collections.unmodifiableList()]] pentru ca evita posibilitatea de a modifica rezultatele, care sunt read-only): | + | - **(2 puncte)** În clasa Dealership implementați următoarele metode, care vor apela metodele corespunzătoare din clasa ''Database'' (atenție, aici metodele trebuie să întoarcă rezultate imutabile, sub forma de deep copy, folosind modalitatea prezentată în laborator, folosind [[https://docs.oracle.com/javase/8/docs/api/java/util/Collections.html | Collections.unmodifiableList()]] pentru ca evita posibilitatea de a modifica rezultatele, care sunt read-only): |
- | - ''getAllTeachers'' | + | - ''getAllSellers'' |
- | - ''getTeachersBySubject'' | + | - ''getAllDealerships'' |
- | - ''getAllStudents'' | + | - ''getSellersByBrand'' |
- | - ''getStudentsBySubject'' | + | - ''getDealershipsByBrand'' |
- | - ''getStudentsByAverageGrade'' | + | - ''getDealershipsByAveragePrice'' |
- | - ''getStudentsByGradeForSubject'' | + | - ''getDealershipsByPriceForBrand'' |
- | - **(1 punct)** În clasa ''Database'', adăugați un contor drept câmp al clasei, de tip static, care va număra instanțierile clasei în cadrul metodei ''getDatabase'', unde se face instanțierea clasei. Implementați metoda ''getNumberOfInstances()'' din ''Database'', care întoarce numărul de instanțieri. | + | - **(1 punct)** În clasa ''Database'', adăugați un contor drept câmp al clasei, de tip static, care va număra instanțierile clasei în cadrul metodei ''getDatabase'', unde se face instanțierea clasei. Implementați metoda ''getNumberOfInstances()'' din ''Database'', care întoarce numărul de instanțieri. |
+ | |||
<note tip> | <note tip> |