Differences

This shows you the differences between two versions of the page.

Link to this comparison view

poo-ca-cd:laboratoare:clase-interne [2022/11/13 01:48]
daniela.becheanu [Exerciții]
poo-ca-cd:laboratoare:clase-interne [2022/11/16 22:35] (current)
daniela.becheanu [Clase anonime]
Line 140: Line 140:
    
  
-<note important>​Clasele interne anonime declarate în metode pot folosi variabilele declarate în metoda respectivă și parametrii metodei dacă aceștia sunt //final// sau **//​effectively final//**. Dacă o variabilă nu e declarată final dar nu se modifică schimbă după inițializare,​ atunci este [[https://​docs.oracle.com/​javase/​tutorial/​java/​javaOO/​localclasses.html#​accessing-members-of-an-enclosing-class|effectively final]].+<note important>​Clasele interne anonime declarate în metode pot folosi variabilele declarate în metoda respectivă și parametrii metodei dacă aceștia sunt //final// sau **//​effectively final//**. Dacă o variabilă nu e declarată final dar nu se modifică după inițializare,​ atunci este [[https://​docs.oracle.com/​javase/​tutorial/​java/​javaOO/​localclasses.html#​accessing-members-of-an-enclosing-class|effectively final]].
  
 Variabilele si parametrii metodelor se află pe segmentul de stivă din memorie creat pentru metoda respectivă,​ ceea ce face ca ele să nu existe la fel de mult cât clasa internă. Dacă variabila este declarată ''​final'',​ atunci la runtime se va stoca o copie a acesteia ca un câmp al clasei interne, în acest mod putând fi accesată și după execuția metodei. Variabilele si parametrii metodelor se află pe segmentul de stivă din memorie creat pentru metoda respectivă,​ ceea ce face ca ele să nu existe la fel de mult cât clasa internă. Dacă variabila este declarată ''​final'',​ atunci la runtime se va stoca o copie a acesteia ca un câmp al clasei interne, în acest mod putând fi accesată și după execuția metodei.
Line 366: Line 366:
 Identificați toate căsuțele de tip **note** din laborator și urmați instrucțiunile din acestea. Puteți folosi scheletul pus la dispoziție. Pentru a ușura procesul de evaluare, creați fișiere separate pentru fiecare task din **note**. Identificați toate căsuțele de tip **note** din laborator și urmați instrucțiunile din acestea. Puteți folosi scheletul pus la dispoziție. Pentru a ușura procesul de evaluare, creați fișiere separate pentru fiecare task din **note**.
 */ */
 +
 +**Schelet de laborator**:​ [[https://​github.com/​oop-pub/​oop-labs/​tree/​master/​src/​lab6|Laborator6]]
  
 Exercițiile din acest laborator au ca scop simularea obținerii prețului unei mașini de la un dealer. Construcția obiectelor necesare o veți face de la zero conform instrucțiunilor din taskuri. Exercițiile din acest laborator au ca scop simularea obținerii prețului unei mașini de la un dealer. Construcția obiectelor necesare o veți face de la zero conform instrucțiunilor din taskuri.
Line 371: Line 373:
  
 ** Task 1 - Structura de bază ** (2p) ** Task 1 - Structura de bază ** (2p)
 +
  
 ** Car ** ** Car **
- 
 Creați clasa ''​Car''​ cu următoarele proprietăți:​ prețul, tipul și anul fabricației. Creați clasa ''​Car''​ cu următoarele proprietăți:​ prețul, tipul și anul fabricației.
- +  * ''​Tipul'' ​este reprezentat printr-un ​enum [[https://​www.w3schools.com/​java/​java_enums.asp|enum]] ''​CarType''​ declarat intern în Car. Acesta conține trei valori: MercedesFiat și Skoda
-Tipul este reprezentat printr-un [[https://​www.w3schools.com/​java/​java_enums.asp|enum]] ''​CarType''​ declarat intern în ''​Car''​. Acesta conține trei valori, ​fiind la latitudinea voastră ce mărci de mașini alegeți. +  * ''​Prețul'' ​și ''​anul''​ vor fi de tipul integers. 
- +Creați un constructor cu toti cei trei parametri, în ordinea din enunț și suprascrieți metoda toString() pentru afișare în felul următor: Car{price=20000,​ carType=SKODA,​ year=2019}
-Prețul și anul pot fi integers.+
  
  
Line 390: Line 391:
  
  
-** Task 2 - Ofertele** (2p)+** Task 2 - Ofertele** (4p)
  
 În clasa ''​Dealership''​ creați trei **clase interne** private care implementează ''​Offer''​. În clasa ''​Dealership''​ creați trei **clase interne** private care implementează ''​Offer''​.
  
-  * ''​BrandOffer''​ - calculează un discount în funcție de tipul mașinii ​(e.g. pentru o dacie discount-ul este 5% din prețul ei) +  * ''​BrandOffer''​ - calculează un discount în funcție de tipul mașinii
-  * ''​DealerOffer''​ - calculează un discount în funcție de vechimea mașinii ​(e.g. 100 pentru fiecare an de vechime) +        - Mercedes: ​discount 5%
-  * ''​SpecialOffer''​ - calculează un discount random ​(e.g. random între 0 și 300)+        - Fiat: discount 10%; 
 +        - Skoda: discount 15%; 
 +  * ''​DealerOffer''​ - calculează un discount în funcție de vechimea mașinii
 +        - Mercedes: discount 300 pentru fiecare an de vechime; 
 +        - Fiat: discount ​100 pentru fiecare an de vechime
 +        - Skoda: discount 150 pentru fiecare an de vechime; 
 +  * ''​SpecialOffer''​ - calculează un discount random, cu seed 20Generarea se va realiza în constructor utilizându-se o instanța globală a unui obiect de tip ''​Random''​ care a fost inițializat cu seed-ul **20** ​și cu limita superioară (bound1000 [[https://​docs.oracle.com/​javase/​8/​docs/​api/​java/​util/​Random.html#​Random-long-|Random]].
  
  
 Adăugați o metodă în clasa ''​Dealership''​ care oferă prețul mașinii după aplicarea discount-urilor din oferte: ''​getFinalPrice(Car car)''​ Adăugați o metodă în clasa ''​Dealership''​ care oferă prețul mașinii după aplicarea discount-urilor din oferte: ''​getFinalPrice(Car car)''​
-  * aplicați pe obiectul ''​car''​ primit ca argument cele trei oferte +  * aplicați pe obiectul ''​car''​ primit ca argument cele trei oferte ​in ordinea: ''​BrandOffer'',​ ''​DealerOffer'',​ ''​SpecialOffer''​. 
-  * metoda ​poate returna prețul final după aplicarea ofertelor ​sau void+  * metoda ​va returna prețul final după aplicarea ofertelor
  
-** Task 3 - Test ** (2p) 
  
-Creați clasa ''​Test''​ cu o metodă ''​main''​ în care să testați funcționalitatea. +Testare oferte: 
-  * cel puțin un obiect ''​Car'' ​pentru fiecare tip de mașină +Creati 2 obiecte ​Car pentru fiecare tip de mașină ​cu urmatoarele valori:. 
-  * un obiect de tip ''​Dealership''​ + -Mercedes:​ 
-  * obțineți și afișați prețul oferit de ''​Dealership''​ pentru fiecare obiect+ -Pret: 20000, An: 2010; 
 + -Pret: 35000, An: 2015; 
 + -Fiat: 
 + -Pret: 3500, An: 2008; 
 + -Pret: 7000, An: 2010; 
 + -Skoda: 
 + -Pret: 12000, An: 2015; 
 + -Pret: 25000, An: 2021; 
 +  
 +  * Creati ​un obiect de tip Dealership. 
 +  * Obțineți și afișați prețul oferit de Dealership(folosind metoda ​''​getFinalPrice''​pentru fiecare obiect.  
 +  * De fiecare data cand se aplica o oferta asupra unui obiect de tip Car se va afisa un mesaj de tipul: "​Applying x discount: y euros",​ unde: 
 +        * x reprezinta oferta care a fost aplicata(Brand,​ Dealer, Special, Client) 
 +        * y reprezinta discount-ul ofertei.
   ​   ​
  
-** Task - Negocierea ** (2p)+** Task - Negocierea ** (2p)
  
-Aăugați în clasa ''​Dealership''​ metoda ''​void negotiate(Car car, Offer offer)''​. Aceasta permite clientului să propună un discount. Dealershipul aplică oferta primită de la client sau nu (dat random de un ''​randInt(2)''​).+Aăugați în clasa ''​Dealership''​ metoda ''​void negotiate(Car car, Offer offer)''​. Aceasta permite clientului să propună un discount. ​
  
-În metoda ''​main''​ din ''​Test''​ apelați ''​negotiate''​ dând ca parametru **oferta sub formă de clasă anonimă**. Implementarea ofertei clientului ​poate fi un simplu return de o valoare aleasă ​de voi+În metoda ''​main''​ apelați ''​negotiate''​ dând ca parametru **oferta sub formă de clasă anonimă**. Implementarea ofertei clientului ​reprezinta returnarea unui discount ​de 5%
- +Pentru testare folositi urmatorul obiect Car: 
- +-Pret20000 
-**Exemplu output** ​aceasta este sugestia noastră, voi puteți afișa și în alt fel, contează însă să evidențiați aplicarea ofertelor și prețurile. +-TipMercedes 
- +-An2019
-<​code>​ +
-Initial price10000 euros +
-Applying Brand discount1000 euros +
-Applying Dealer discount100 euros +
-Applying Special discount: 957 euros +
-Final price: 7943 +
-Applying Client discount: 600 euros +
-Final price after negotiation:​ 7343 euros +
-</​code>​+
  
-** Task - Lambda** (1p)+** Task - Lambda** (2p)
  
-Testați folosirea expresiilor lambda pe următorul caz: pe o listă de obiecte de tip Car cu prețuri variate, eliminați toate mașinile care au prețul peste o anumită sumă. Afișați lista înainte și după modificare.+Testați folosirea expresiilor lambda pe următorul caz: pe o listă de obiecte de tip Car cu prețuri variate, eliminați toate mașinile care au prețul peste 25000. Afișați lista înainte și după modificare. 
 +Pentru lista folositi urmatoarele obiecte Car: 
 + -Mercedes:​ 
 + - Pret: 30000, An: 2019; 
 + - Pret: 50000, An: 2021; 
 + -Fiat: 
 + - Pret: 10000, An: 2018; 
 + -Skoda: 
 + - Pret: 20000, An: 2019;
    * Hint: exemplul din secțiunea [[poo-ca-cd:​laboratoare:​clase-interne#​expresii_lambda|Expresii Lambda]]    * Hint: exemplul din secțiunea [[poo-ca-cd:​laboratoare:​clase-interne#​expresii_lambda|Expresii Lambda]]
  
poo-ca-cd/laboratoare/clase-interne.1668296890.txt.gz · Last modified: 2022/11/13 01:48 by daniela.becheanu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0