Differences

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

Link to this comparison view

poo-ca-cd:laboratoare:clase-interne [2020/11/16 19:36]
adriana.draghici [Exerciții]
poo-ca-cd:laboratoare:clase-interne [2022/11/16 22:35] (current)
daniela.becheanu [Clase anonime]
Line 1: Line 1:
-===== Clase interne =====+===== Laboratorul 6: Clase interne =====
  
 **Video introductiv:​** [[https://​youtu.be/​KIyaRwog3q8| link ]] **Video introductiv:​** [[https://​youtu.be/​KIyaRwog3q8| link ]]
  
-**Slides din video**:​{{:​poo-ca-cd:​laboratoare:​clase-interne:​laborator_6_-_clase_interne.pdf|}}+**Slides din video**:​{{:​poo-ca-cd:​laboratoare:​clase-interne:​laborator_6_-_clase_interne.pdf| ​link}}
 ==== Obiective ==== ==== Obiective ====
  
Line 30: Line 30:
 ====Clase interne "​normale"​ ==== ====Clase interne "​normale"​ ====
  
-O clasă internă este definită în interiorul unei clase și poate fi accesată doar la runtime printr-o instanță a clasei externe (la fel ca metodele și variabilele ne-statice). Compilatorul creează fișiere //.class// separate pentru fiecare clasă internă, în exemplul de mai jos generând fișierele ''​Outer.class''​ și ''​Outer$Inner.class'',​ însă execuția fișierului ''​Outer$Inner.class''​ nu este permisă. ​+O clasă internă este definită în interiorul unei clase și poate fi accesată doar la runtime printr-o instanță a clasei externe (la fel ca metodele și variabilele ne-statice). Compilatorul creează fișiere //.class// separate pentru fiecare clasă internă, în exemplul de mai jos generând fișierele ''​Car.class''​ și ''​Car$OttoEngine.class'',​ însă execuția fișierului ''​Car$OttoEngine.class''​ nu este permisă. ​
  
 <code java Test.java>​ <code java Test.java>​
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.
 +
 +Până la [[http://​ilkinulas.github.io/​programming/​java/​2016/​03/​27/​effectively-final-java.html|Java 8]] nu exista conceptul de //​effectively final// si toate aceste variabile trebuiau declarate //final//
 </​note>​ </​note>​
  
Line 190: Line 192:
 Clasele interne le vedem ca pe membri ai claselor exterioare, așa cum sunt câmpurile și metodele. De accea, ele pot lua toți modificatorii disponibili membrilor, printre ei aflându-se modificatori pe care clasele exterioare nu le pot avea (e.g. private, static). Clasele interne le vedem ca pe membri ai claselor exterioare, așa cum sunt câmpurile și metodele. De accea, ele pot lua toți modificatorii disponibili membrilor, printre ei aflându-se modificatori pe care clasele exterioare nu le pot avea (e.g. private, static).
  
-Așa cum pentru a accesa metodele și variabilele statice ale unei clase nu este nevoie de o instanță a aceteia, putem obține o referință către o clasă internă fără a avea nevoie de o instanță a clasei exterioare. ​+Așa cum pentru a accesa metodele și variabilele statice ale unei clase nu este nevoie de o instanță a acesteia, putem obține o referință către o clasă internă fără a avea nevoie de o instanță a clasei exterioare. ​
  
   ​   ​
Line 365: Line 367:
 */ */
  
-Exercițiile din acest laborator, cu excepția taskului 0, 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.+**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.
  
-** Task 0 ** (1p) 
- 
-Copiați clasele date ca exemplu în secțiunile [[poo-ca-cd:​laboratoare:​clase-interne#​clase_interne_normale|Clase interne normale]] și [[poo-ca-cd:​laboratoare:​clase-interne#​clase_anonime|Clase anonime]] în proiectul vostru și executați-le. ​ 
  
 ** 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 392: 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>​ +
- +
-Ce fișiere .class sunt generate la compilare?  +
-  * puteți să le vedeți în directorul pt output pe care l-ați configurat pt proiect în IDE, sau compilând cu javac din linie de comandă +
-  * lăsați un comentariu în clasa Test cu ce clase observați că s-au generat și ce s-a generat pentru clasa anonimă +
-  ​+
  
-** 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.1605548193.txt.gz · Last modified: 2020/11/16 19:36 by adriana.draghici
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