This shows you the differences between two versions of the page.
|
poo:breviare:breviar-03 [2025/10/16 12:23] stefanel.turcu [Principii POO] |
poo:breviare:breviar-03 [2025/10/16 12:26] (current) stefanel.turcu [Extra: Tipuri speciale în Java: enum și record] |
||
|---|---|---|---|
| Line 397: | Line 397: | ||
| Un alt exemplu elocvent, pentru acest prinicpiu POO, este operatorul ''+'' care execută operații diferite în cotexte diferite. | Un alt exemplu elocvent, pentru acest prinicpiu POO, este operatorul ''+'' care execută operații diferite în cotexte diferite. | ||
| + | |||
| + | ==== Extra: Tipuri speciale în Java: enum și record ==== | ||
| + | |||
| + | === Ce este un enum? === | ||
| + | |||
| + | Un **enum** (de la *enumeration*) este un tip special de clasă care definește un set fix de constante. | ||
| + | Este folosit atunci când o variabilă poate avea doar un număr limitat de valori posibile. | ||
| + | |||
| + | **Exemplu:** | ||
| + | |||
| + | <code java> | ||
| + | public enum ZiSaptamana { | ||
| + | LUNI, MARTI, MIERCURI, JOI, VINERI, SAMBATA, DUMINICA | ||
| + | } | ||
| + | |||
| + | public class Program { | ||
| + | public static void main(String[] args) { | ||
| + | ZiSaptamana zi = ZiSaptamana.VINERI; | ||
| + | |||
| + | // Poți folosi switch cu enum | ||
| + | switch (zi) { | ||
| + | case SAMBATA, DUMINICA -> System.out.println("Weekend!"); | ||
| + | default -> System.out.println("Zi de lucru."); | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | </code> | ||
| + | |||
| + | **Observații:** | ||
| + | * Valorile //LUNI//, //MARTI//, etc. sunt constante (publice, statice și imutabile). | ||
| + | * Se folosesc frecvent pentru a face codul mai clar și mai sigur (în locul valorilor numerice sau string). | ||
| + | |||
| + | === Ce este un record? === | ||
| + | |||
| + | Un **record** este o formă modernă de clasă introdusă în Java 14 (stabilă din Java 16), | ||
| + | care servește pentru a defini **obiecte imutabile de tip „data class”**, adică structuri care doar rețin date. | ||
| + | |||
| + | **Exemplu simplu:** | ||
| + | |||
| + | <code java> | ||
| + | public record Punct(int x, int y) { } | ||
| + | |||
| + | public class Main { | ||
| + | public static void main(String[] args) { | ||
| + | Punct p1 = new Punct(3, 5); | ||
| + | System.out.println(p1); // => Punct[x=3, y=5] | ||
| + | System.out.println(p1.x()); // accesează câmpul x | ||
| + | } | ||
| + | } | ||
| + | </code> | ||
| + | |||
| + | **Ce oferă automat un record:** | ||
| + | * constructor pentru toți parametrii (`new Punct(int x, int y)`) | ||
| + | * metode //x()// și //y()// pentru acces la date (getters) | ||
| + | * metode //equals()//, //hashCode()// și //toString()// generate automat | ||
| + | * toate câmpurile sunt //private// și //final// → obiectul este imutabil | ||
| + | |||
| + | **Avantaj:** | ||
| + | **record** reduce semnificativ codul boilerplate comparativ cu o clasă clasică. | ||
| + | |||
| + | **Exemplu echivalent (clasă obișnuită):** | ||
| + | |||
| + | <code java> | ||
| + | public class PunctClasic { | ||
| + | private final int x; | ||
| + | private final int y; | ||
| + | |||
| + | public PunctClasic(int x, int y) { | ||
| + | this.x = x; | ||
| + | this.y = y; | ||
| + | } | ||
| + | |||
| + | public int getX() { return x; } | ||
| + | public int getY() { return y; } | ||
| + | |||
| + | @Override | ||
| + | public String toString() { | ||
| + | return "Punct[x=" + x + ", y=" + y + "]"; | ||
| + | } | ||
| + | } | ||
| + | </code> | ||
| + | |||
| + | **Când să folosești un record:** | ||
| + | * Când vrei un obiect simplu, imutabil, care doar conține date. | ||
| + | * Când nu ai nevoie de moștenire (un //record// nu poate extinde altă clasă). | ||