A Java-ban a HashMap és hasonló adatszerkezetek kulcsainak kezelése fontos szerepet játszik a programok teljesítményében és megbízhatóságában. Ha egy kulcs hashCode() értéke 0, akkor az összes olyan kulcs, amelynek a hashCode() értéke szintén 0, ugyanabban a „vödörben” kerül tárolásra. Ez ütközéseket okozhat, ami nemcsak hogy ronthatja a teljesítményt, hanem a kulcsok keresését is lelassíthatja. Ilyen esetekben ajánlott kerülni a null kulcsok használatát is, mert bár a HashMap és a Hashtable lehetővé teszik a null kulcsok beillesztését, ez nem a legjobb gyakorlat, mivel váratlan viselkedéshez és hibákhoz vezethet. A legjobb megoldás, ha egy különleges objektumot használunk, amely a null értéket reprezentálja, és ezt egy speciális módon kezeljük.
A Java egyik erőssége a különböző módszerek biztosítása az immutábilis térképek létrehozásához. Az immutábilis térkép azt jelenti, hogy miután egy térkép létrejött, annak tartalmát nem lehet módosítani. Erre számos mód létezik. Az egyik legelterjedtebb módja a Collections.unmodifiableMap() metódus használata, amely egy olvasható, módosíthatatlan nézetet biztosít az adott térképről. Egy másik lehetőség a Map.of() metódus, amely lehetővé teszi, hogy az új térképet azonnal úgy hozhassuk létre, hogy az ne legyen módosítható. A Java 9 óta elérhető a Map.ofEntries() metódus is, amely a kulcs-érték párokat egyedi bejegyzésekkel adja hozzá. Ezen kívül a Google Guava könyvtár is biztosítja az ImmutableMap osztályt, amellyel szintén immutábilis térképeket hozhatunk létre. A Guava ImmutableMap.Builder osztálya lehetőséget ad arra, hogy kulcs-érték párokat adjunk hozzá a térképhez, és végül egy immutábilis térképet építsünk.
Fontos megérteni, hogy bár sok Java-ban használt osztály immutábilis, az osztályok mezőit is így kell kezelni a várt eredmények elérése érdekében. A String, Integer, Long, Short, Byte, Character, Double, Float, BigInteger, BigDecimal, Enum és a java.time csomag osztályai, mint a LocalDate, LocalTime, LocalDateTime, Instant, mind immutábilisak. Azonban amikor ilyen típusú objektumokat osztályok mezőiként használunk, ügyelnünk kell arra, hogy azok final és private legyenek a váratlan viselkedés elkerülése érdekében. Így biztosíthatjuk, hogy az immutábilis osztályok sem válhatnak módosíthatóvá az osztályokon belül.
Az indexek szerepe is fontos a Java-ban, mivel azok az adatszerkezetek és adatbázisok gyors kereshetőségét teszik lehetővé. Az indexek gyorsabb keresést és hatékonyabb lekérdezéseket biztosítanak azáltal, hogy a program könnyen megtalálja a kívánt elemeket anélkül, hogy az egész gyűjteményt át kellene néznie. Az adatbázisokban számos index típus létezik, például a primér kulcs indexek, amelyek biztosítják az adatok integritását, vagy a nem klaszterezett indexek, amelyek a kulcsértékek mellett mutatókat tartalmaznak az adatok tényleges soraira. Az indexek előnye, hogy gyorsítják a keresési műveleteket, de hátrányuk, hogy megnövelhetik az adatbázis méretét, és lassíthatják az adatok beszúrását vagy frissítését, mivel az indexeket is frissíteni kell.
A CompletableFuture, Callable, és Runnable típusú jövőkészletek különböző aszinkron műveletek kezelésére szolgálnak a Java-ban. A Callable hasonlít a Runnable-ra, de ellentétben a Runnable-val, visszaadhat egy értéket és kivételt is dobhat. Ezzel szemben a CompletableFuture lehetőséget biztosít az aszinkron műveletek összefűzésére, hiba kezelésére és visszahívások kezelésére. Ezen kívül lehetővé teszi, hogy olyan jövőt hozzunk létre, amely már el van végezve, és egy értéket vagy kivételt tartalmaz. A Future objektumok használatával könnyen ellenőrizhetjük a számítás befejezését, várhatunk a befejezésére, és lekérhetjük a művelet eredményét.
A Java-ban az XML fájlok JSON formátumba történő átalakítása is lehetséges különböző könyvtárak segítségével, mint például a Jackson vagy a Gson. Ezek lehetővé teszik a gyors és egyszerű konverziót XML-ből JSON-ba, így az adatok könnyebben feldolgozhatók más rendszerekben is.
Végül, miközben a különböző Java osztályok és struktúrák használata növeli a programok hatékonyságát, mindig érdemes mérlegelni a teljesítményt és a karbantarthatóságot is. Az immutábilis objektumok, az indexek és az aszinkron műveletek alkalmazása mind hozzájárulhatnak a kód tisztaságához és gyorsaságához, de a túlzott bonyolítás és a nem megfelelő használat hátrányokat is okozhat. A legjobb gyakorlatok alkalmazása mindig kulcsfontosságú a sikeres és megbízható fejlesztéshez.
Hogyan működik a String osztály és miért fontos a változtathatatlansága Java-ban?
A Java programozási nyelvben a String osztály egy karakterekből álló sorozatot képvisel. Ez az egyik leggyakrabban használt osztály a nyelvben, és a java.lang csomag részeként automatikusan importálódik minden Java programba. A String objektumok létrehozása két módon történhet: string literál használatával vagy az új kulcsszó és a konstruktor segítségével.
Például:
Mindkét példa egy-egy String objektumot hoz létre, amely a "Hello, world!" karakterláncot tartalmazza. Azonban fontos megérteni, hogy miután egy String objektumot létrehoztunk, annak értéke nem változtatható meg. Ezért a String osztály változtathatatlan, azaz immutable osztály.
A String osztály számos hasznos metódust kínál a szövegkezeléshez, mint például a charAt(), indexOf(), substring(), toUpperCase(), toLowerCase(), trim(), length() és mások. A String objektumok széles körben használatosak Java-ban metódusok paramétereként, konkatenációs műveletekben, illetve metódusok visszatérési értékeként is.
Miért változtathatatlan a String?
A String változtathatatlanságának kulcsfontosságú okai többek között biztonsági, teljesítménybeli és programozási szempontokból is lényegesek. Az alábbiakban összegzem a legfontosabb tényezőket:
-
Biztonság: A karakterláncok gyakran tartalmaznak érzékeny információkat, például jelszavakat, URL-eket vagy adatbázis-összekötő karakterláncokat. Ha a
Stringváltoztatható lenne, akkor ez a biztonságot gyengítené, mivel a titkos adatokat könnyen módosíthatnák véletlenül vagy szándékosan. A változtathatatlan karakterláncok biztosítják, hogy az érzékeny adatok ne változhassanak meg a program futása alatt. -
Gyorsítótárazás és teljesítmény: A Java
Stringliterálokat cache-lé teszi egy ún. "String pool"-ban a hatékony újrafelhasználás érdekében. Ha a karakterláncok módosíthatóak lennének, az egyik karakterlánc változtatása hatással lenne a többi, ugyanazon literálra hivatkozó karakterláncra, ami kiszámíthatatlan viselkedést eredményezne. A változtathatatlanString-ek biztosítják, hogy az értékek konzisztens és előre kiszámítható módon viselkedjenek, még akkor is, ha több helyről hivatkoznak rájuk. -
Szinkronizálás és szálbiztonság: A változtathatatlan objektumok alapvetően szálbiztonságosak, mivel az állapotukat nem lehet egyszerre módosítani több szál által. Ez megszünteti annak szükségességét, hogy szinkronizációs mechanizmusokat (például zárolásokat) alkalmazzunk, amikor több szál dolgozik a
String-ekkel, ezáltal egyszerűbbé és gyorsabbá téve a kódot több szálú környezetekben. -
Osztályok betöltése: A Java a
Stringobjektumokat osztálynevek és erőforrás utak tárolására használja. A változtathatatlanság biztosítja, hogy ezek a hivatkozások stabilak maradjanak az alkalmazás élettartama alatt, megakadályozva a problémákat az osztályok betöltése és az erőforrások elérése terén. -
Hash-alapú adattárolók kulcsaként való használat: A
String-eket gyakran használják kulcsoként hash-alapú adattárolókban, mint aHashMapvagyHashSet. A változtathatatlanság garantálja, hogy aStringhash-kódja következetes maradjon az élettartama alatt, így biztosítva az ilyen adattárolók helyes és hatékony működését.
Hol tárolódik egy új String objektum?
A String tárolásának helye attól függ, hogyan lett létrehozva. Két fő helyszín létezik: a String literálok medencéje és a heap memória.
-
String Literál Pool: Amikor
Stringliterált hozunk létre (pl.String str = "Hello";), a Java először aStringpool-ban ellenőrzi, hogy létezik-e már ugyanolyan tartalmúStringobjektum. Ha igen, akkor újra felhasználja azt, biztosítva ezzel a hatékonyságot. Ez azt jelenti, hogy több változó is ugyanarra azStringobjektumra hivatkozhat a memóriában, így helyet takarítva meg. -
Heap Memória: Ha a
Stringliterál nem létezik a pool-ban, akkor egy újStringobjektum jön létre, és a heap memóriában tárolódik. Ez két fő esetben történik: amikor aznewkulcsszóval hozunk létreStringobjektumot, vagy amikor egy meglévőStringváltozót módosítunk, így új objektumot hozunk létre (például aconcat()metódus használatával). -
String Interning: A
intern()metódussal explicit módon elhelyezhetünk egyString-et a pool-ban. Ez biztosítja, hogy mindenStringváltozó, amely ugyanazt a tartalmat tartalmazza, ugyanarra az objektumra hivatkozzon a pool-ban, még akkor is, hanewkulcsszóval hozták létre.
Hová tárolódik maga a String, és hová a hivatkozás?
A String objektumok a heap memóriában tárolódnak, mivel objektumok, de a rájuk mutató hivatkozások a stack memóriában találhatók. A stack memória a helyi változók és metódusparaméterek tárolására szolgál. Például a következő kódban:
A String objektum maga a heap memóriában tárolódik, míg a myString változó, amely hivatkozik rá, a stack memóriában található.
Alternatívák a String osztály használatára
Amennyiben nem szeretnénk a String osztályt használni, a következő alternatívák állnak rendelkezésünkre:
-
StringBuilder: A
StringBuilderegy módosítható karakterlánc osztály, amely lehetővé teszi a karakterláncok létrehozását és módosítását. AStringBuildernem szálbiztos, de gyorsabb, mint aStringBuffer. -
StringBuffer: A
StringBufferszintén módosítható karakterlánc osztály, de szálbiztos. Azonban lassabb, mint aStringBuilder, mivel a szálbiztos műveletekhez szükséges szinkronizálás miatt. -
Karakter tömbök: Karakter tömbök is használhatók karakterláncok ábrázolására, de ezek nem olyan hatékonyak, mint a
Stringobjektumok, és bonyolultabbak a használatuk.
Egyedi, változtathatatlan String osztály létrehozása
Bár a String osztály már változtathatatlan, előfordulhat, hogy egy egyedi, változtathatatlan String típusra van szükségünk. Ezt a következőképpen érhetjük el:
-
Definiálj egy
finaltípusú privát mezőt, amely tárolja az értéket. -
Hozz létre egy konstruktort, amely beállítja a privát mezőt.
-
Ne biztosíts setter metódust, amely lehetővé tenné a mező módosítását.
-
Szükség esetén írj fel
Hogyan működnek a Spring Boot annotációk és milyen szerepet töltenek be a különböző rétegek között?
A Spring Framework egyik alapvető eleme az annotációk használata, amelyek különböző típusú osztályokat jelölnek ki, hogy meghatározzák azok szerepét az alkalmazás rétegeiben. Ezek az annotációk, mint a @Component, @Service, @Repository és @Controller, mind a Spring bean-eket jelölik, de mindegyik különböző funkcióval bír, amely segíti az alkalmazás rétegezését és szervezését. A Spring Boot az osztályok automatikus kezelését és életciklusuk nyomon követését is lehetővé teszi azáltal, hogy az annotációk segítségével automatikusan regisztrálja az osztályokat.
A @Controller annotációt használják a Spring Framework-ben azokban az osztályokban, amelyek a bejövő HTTP-kéréseket kezelik, és válaszokat adnak vissza. Az ilyen típusú osztályok gyakran webalkalmazásokban, REST vezérelt környezetekben vagy MVC (Model-View-Controller) alkalmazásokban találhatók meg. Amikor egy osztályt @Controller annotációval látunk el, a Spring automatikusan létrehozza és kezeli annak életciklusát, mint Spring bean-t, amelyet más Spring által menedzselt komponensekbe injektálhatunk az @Autowired annotáció segítségével.
Az alábbiakban bemutatott példában a MyController osztály a @Controller annotációval van ellátva, és egy @Autowired annotációval injektált MyService osztályt használ. A handleRequest metódus, amely a bejövő GET kéréseket kezeli, a MyService osztályból származó adatokat modellbe helyezi, majd egy nézetet ad vissza.
Ez a példa jól szemlélteti, hogyan működik a @Controller annotáció és annak integrációja más Spring komponensekkel, mint például a szolgáltatások, amelyek az üzleti logikát kezelik.
A Spring Framework különböző típusú annotációi, mint például a @Service, @Repository és @Component, mind ugyanazon célt szolgálják: Spring bean-ek létrehozása és azok kezelésének lehetővé tétele. Azonban mindegyik annotáció más-más szerepkört határoz meg az alkalmazásban. A @Service annotációt általában az üzleti logikát kezelő osztályokhoz használják, míg a @Repository annotáció a perzisztencia réteget jelöli ki, azaz az adatbázisokkal való interakciót végző osztályokat. A @Component annotáció a legáltalánosabb, és bármilyen osztályt jelölhet Spring bean-ként, amely nem illik a fenti kategóriákba, például segédosztályok vagy egyéb általános feladatokat végző osztályok.
Ezen annotációk mindegyike a Spring "sztereotípiákat" képviseli, amelyek segítenek a Spring alkalmazás rétegeinek világosabb és rendezettebb strukturálásában. A @ComponentScan annotáció lehetővé teszi a Spring számára, hogy automatikusan beolvassa az alkalmazás csomagjait, és regisztrálja a megfelelő annotációval ellátott osztályokat Spring bean-ként az alkalmazás kontextusában. Ez megkönnyíti az osztályok automatikus létrehozását és konfigurálását, amely különösen hasznos lehet nagyobb alkalmazások esetén.
A Spring Boot automatikus konfigurációs mechanizmusa, amely az alkalmazásban található függőségek alapján automatikusan konfigurálja a Spring alkalmazás egyes komponenseit, tovább egyszerűsíti a fejlesztés folyamatát. Ez a funkció lehetővé teszi, hogy a fejlesztők gyorsan és könnyedén beállítsák az alkalmazást anélkül, hogy minden egyes komponens konfigurálásával kellene foglalkozniuk. A rendszer képes automatikusan észlelni és konfigurálni például a biztonsági, adatkezelési vagy webes komponenseket, amint azok a megfelelő könyvtárak jelen vannak a classpath-ban.
Fontos kiemelni, hogy a @RestController és a @Controller annotációk között is van különbség. Míg a @Controller osztályok gyakran HTML nézeteket adnak vissza, és MVC mintát követnek, a @RestController annotációt arra használják, hogy egy osztályt RESTful szolgáltatásként definiáljanak. Ez azt jelenti, hogy minden metódus válasza közvetlenül a HTTP válasz törzsébe kerül, anélkül, hogy egy nézetre lenne szükség. A @RestController tehát a REST API-kat kezelő osztályokhoz ideális, míg a @Controller inkább a hagyományos webalkalmazások vezérlőit jelöli.
Ez a különbség fontos, mivel a REST API-k és a hagyományos MVC alkalmazások alapvetően eltérő válaszformátumokat és architektúrát követnek. A REST API-k JSON vagy XML formátumban válaszolnak, míg az MVC alkalmazások HTML-t adnak vissza a felhasználó böngészőjébe.
Ezen kívül érdemes megérteni, hogy bár az annotációk tisztán elkülönítik az alkalmazás különböző rétegeit, a Spring nem csupán az osztályok kijelölésére szolgáló mechanizmus, hanem egy erőteljes keretrendszer, amely az alkalmazások bonyolult szerkezetét is képes kezelni. Az annotációk hatékony használata elősegíti az alkalmazás modularizálását, amely könnyen karbantartható és bővíthető marad.
Miért fontos a Java új funkcióinak megértése?
A Java különböző verziói rendszeresen új funkciókkal és fejlesztésekkel egészítik ki a nyelvet, amelyeket a fejlesztők napi munkájuk során kihasználhatnak a hatékonyabb programozás érdekében. Az új jellemzők nemcsak a kód minőségét javítják, hanem jelentős mértékben hozzájárulnak a szoftverek teljesítményének növeléséhez és a fejlesztési folyamatok egyszerűsítéséhez. A legújabb Java verziók, mint a Java 9, 10, 11, 12, és a 13, számos hasznos újítást tartalmaznak, amelyek alapvetően megváltoztathatják a programozási szokásokat és lehetőségeket.
A Java 9-es verzióval bevezetett új HTTP/2 kliens például lehetővé teszi, hogy az alkalmazások gyorsabban és hatékonyabban kezeljék a hálózati kéréseket. Az új kliens API-ja sokkal egyszerűbbé teszi az HTTP/2 támogatásának használatát, mint a korábbi HttpURLConnection osztály, amely számos korláttal rendelkezett. Az alábbi egyszerű példakód bemutatja, hogyan lehet HTTP kéréseket küldeni és válaszokat fogadni az új HttpClient osztály segítségével:
A Java 10-es verzió bevezetett egy új lehetőséget a változók típusának automatikus következtetésére a var kulcsszóval. Ezzel a funkcióval a fejlesztők elhagyhatják a típusok explicit megadását a helyi változók számára, ami rövidebb és tisztább kódot eredményez. Az alábbi példakód bemutatja, hogyan használható a var kulcsszó a helyi változók deklarálására:
A Java 11-es verzióban számos új módszer került bevezetésre a fájlkezelés terén, mint például a Files.readString() és Files.writeString() metódusok, amelyek lehetővé teszik fájlok egyszerűbb olvasását és írását karakterláncok formájában. Ez a változtatás jelentős előnyökkel jár, mivel az eddigi fájlkezelési műveletek bonyolultabbak voltak, és sokkal több kódot igényeltek. A következő példakód bemutatja, hogyan olvashatunk fájlt és írhatunk bele:
A Java 12-es verzióban a számformátumok egyszerűsítése érdekében bevezetésre került a "Compact Number Formatting" funkció, amely lehetővé teszi a nagy számok tömörített formátumban történő megjelenítését. Ez különösen hasznos, ha a felhasználói felületen vagy riportokban kell nagy számokat megjeleníteni, hogy azok könnyebben olvashatók legyenek. Az alábbi példakód megmutatja, hogyan formázhatók a számok rövid és hosszú formátumban:
A Java 12-ben a String::indent metódus is megjelent, amely lehetővé teszi a karakterláncok behúzásának módosítását. Ez hasznos lehet, amikor egy szöveges blokk megjelenítésére van szükség, és fontos, hogy minden sor megfelelően legyen behúzva, például XML vagy JSON fájlok esetén.
A Java 13 és 14-es verziók nem hoztak olyan jelentős változásokat, amelyek alapvetően átalakították volna a nyelvet, de kisebb fejlesztések és optimalizálások történtek. A Java 13-ban a ByteBuffer API-ja frissült, és javítások történtek a GC (garbage collection) működésében is.
A fejlesztőknek érdemes tisztában lenniük a Java legújabb verzióinak új lehetőségeivel, mivel ezek jelentősen hozzájárulhatnak a kód optimalizálásához, a hibák elkerüléséhez és a fejlesztési idő csökkentéséhez. Az új funkciók figyelemmel kísérése és alkalmazása nem csupán a fejlesztési hatékonyságot növeli, hanem segít abban is, hogy a fejlesztői csapat mindig naprakész maradjon, és a legmodernebb technológiákat alkalmazza munkája során.
Miért nem lehet statikus metódust felülírni Java-ban, és mit jelent az SOLID elv a programozásban?
A Java nyelv egyik fontos koncepciója, amely minden fejlesztő számára alapvető, az osztályok közötti öröklődés és metódusfelülírás. Azonban fontos tisztázni, hogy nem minden metódus választható felülírásra, és léteznek szabályok, amelyek meghatározzák, miért nem alkalmazható minden esetben a felülírás (overriding). Ezen kívül, a programozás során sokszor kerülünk kapcsolatba a SOLID elvekkel, amelyek az objektum-orientált tervezés alapját képezik, segítve a szoftverek fenntarthatóságát és bővíthetőségét.
Java-ban a statikus metódusok nem felülírhatók. A statikus metódusok a konkrét osztályhoz tartoznak, nem pedig a példányokhoz, így a statikus metódusok közvetlenül az osztály nevével hívhatók meg, objektum létrehozása nélkül. Amikor egy alosztály statikus metódust definiál az ősosztályban található metódushoz hasonló névvel és paraméterekkel, akkor nem történik felülírás, hanem egy új metódus "elrejtése" történik, amit metódus elrejtésnek (method hiding) nevezünk. A statikus metódusok tehát nem helyettesíthetik a szülőosztály metódusait, mivel azok a szülőosztályhoz kötődnek, nem pedig az objektumokhoz.
A Java nyelv ezen tulajdonsága a fejlesztők számára figyelmeztetésként szolgál arra, hogy ne keverjék össze a statikus metódusok használatát az öröklődéssel és felülírással. A statikus metódusokat az osztály szintjén kell értelmezni, míg az öröklés és felülírás az objektum szintjén zajlik.
Ezen kívül fontos tisztázni, hogy a programozásban a metódusok felülírása (overriding) és túlterhelése (overloading) alapvető mechanizmusok, amelyek segítik a kód újrafelhasználhatóságát és egyszerűsítik az objektum-orientált tervezést. A túlterhelés esetében ugyanazzal a metódusnévvel, de különböző paraméterekkel hozhatunk létre több változatot. Azonban a visszatérési típus egyedül nem elegendő ahhoz, hogy a metódust túlterheljük, tehát az azonos paraméterekkel rendelkező metódusok különböző visszatérési típusokkal nem hozhatók létre Java-ban.
A metódusok felülírása során fontos, hogy az alosztály metódusa ugyanazokat a kivételeket dobja, mint a szülőosztály metódusa, vagy annál kevésbé szigorú kivételeket használjon. Ha a szülőosztály metódusa például egy Exception típusú kivételt dob, akkor az alosztály metódusa szintén ezt a kivételt dobhatja, de használhat szűkebb típusú kivételt, mint például IOException. Ezzel biztosítjuk, hogy a kód kompatibilitása megmarad, miközben az alosztály egyes viselkedését specifikusabbá tehetjük.
A fenti példában a Dog osztály felülírja az Animal osztály speak() és eat() metódusait. Az eat() metódus nem dob kivételt, míg a speak() metódus IOException kivételt dob. Ilyenkor a main() metódusban egy try-catch blokk segítségével kezelhetjük azokat a kivételeket, amelyek a metódusok végrehajtása közben felmerülnek. A Java kivételkezelési mechanizmusa kulcsfontosságú az ilyen helyzetek megfelelő kezeléséhez, mivel biztosítja, hogy a program ne omljon össze akkor sem, ha egy metódus hibát dob.
Amikor a fejlesztő metódusokat hoz létre, nemcsak a felülírás és túlterhelés szabályait kell figyelembe venni, hanem az úgynevezett SOLID elveket is. A SOLID egy mozaikszó, amely öt fontos elvet képvisel az objektum-orientált tervezésben:
-
Single Responsibility Principle (SRP) – Egy osztálynak csak egy feladata legyen. Az osztályoknak világos, jól körülhatárolt szerepekkel kell rendelkezniük, elkerülve a túlzottan összetett és nehezen karbantartható kódot. Ha például egy osztály felelős a felhasználó kezeléséért, akkor nem szabad, hogy email küldésével vagy fizetési tranzakciók kezelésével is foglalkozzon.
-
Open/Closed Principle (OCP) – Az osztályoknak nyitottnak kell lenniük a bővítésre, de zártnak a módosításra. Ez azt jelenti, hogy új funkcionalitások hozzáadása esetén nem kell az osztály meglévő kódját módosítani. A bővítést például úgy érhetjük el, hogy új osztályokat hozunk létre, amelyek kiterjesztik a meglévő osztályokat, de nem módosítják a régi kódot.
-
Liskov Substitution Principle (LSP) – Az alosztályoknak képesnek kell lenniük arra, hogy felváltsák a szülőosztályokat anélkül, hogy a program működése megsérülne. Ez azt jelenti, hogy az öröklött osztályok nem szabad, hogy olyan viselkedést váltsanak ki, amely hibát eredményezhet, ha a szülőosztályt egy alosztályra cseréljük.
-
Interface Segregation Principle (ISP) – Az osztályoknak nem kell minden olyan metódust implementálniuk, amelyek nem kapcsolódnak közvetlenül az ő feladatukhoz. A nagy, általános interfészeket érdemes kisebb, specifikusabb interfészekre bontani, így biztosítva, hogy az osztályok csak azokat a metódusokat implementálják, amelyek valóban szükségesek számukra.
-
Dependency Inversion Principle (DIP) – A magas szintű moduloknak nem kell közvetlenül alacsony szintű modulokhoz kapcsolódniuk. Ehelyett mindkét típusú modulnak az absztrakciókhoz kell kapcsolódnia. Az osztályok nem közvetlenül a konkrét megvalósításokra, hanem azok interfészeire kell, hogy támaszkodjanak.
A SOLID elvek segítenek abban, hogy a kód karbantartható, tesztelhető és bővíthető maradjon, ami kulcsfontosságú a nagyobb és komplexebb rendszerek fejlesztésénél.
Miért nem működik a demokráciák finanszírozása a gazdagok előnyére?
Hogyan befolyásolták az etnikai és bevándorlási attitűdök az iowai szavazókat a 2016-os választásokon?
Hogyan alakult ki a „Battle of the Billionaires” és miért volt jelentős a WrestleMania XXIII eseményén?

Deutsch
Francais
Nederlands
Svenska
Norsk
Dansk
Suomi
Espanol
Italiano
Portugues
Magyar
Polski
Cestina
Русский