1. Szintaktikus cukor
A programozók szeretik, ha néhány összetett kód vagy logika néhány sorban írható, így a kód kompakt és olvasható. A programozási nyelvek készítői pedig néha segítenek ebben.
Egy sima nyelvi funkciót, amely lehetővé teszi a parancsikon használatát (kevesebb kód írását), szintaktikai cukornak nevezzük . De, hogy őszinte legyek, nagyon kevés van belőle a Java-ban.
A Java készítői mindent megtettek annak érdekében, hogy kiküszöböljék a Java redundanciáját. Ha a C++ lehetővé teszi, hogy valamit 20 módon csinálj, akkor a Java csak egyféleképpen.
De sem a Java programozóknak, sem a Java alkotóinak nem tetszett a szabadság hiánya. És néha a cukor megkönnyíti az olyan hétköznapi emberek életét, mint te és én.
Egyébként már találkoztál néhány szintaktikai cukorral: autoboxing és unboxing . Hasonlítsuk össze:
Hosszú kód | Kompakt kód |
---|---|
|
|
|
|
|
|
A bal oldali hosszú kód helyett jobbra írhatjuk a kompaktabb kódot. Az intelligens Java fordító pedig a kód rövid verziója alapján generálja a kód bőbeszédű verzióját. Pontosan ez a szintaktikai cukor.
2. Következtetés a változó típusára: a var
kulcsszó
A Java 11-ben a fordító még intelligensebbé vált, és most már képes meghatározni a deklarált változó típusát a hozzárendelt érték típusa alapján . Kódban így néz ki:
var name = value;
Ahol name
az új változó neve, az érték a kezdeti értéke, és var
a változó deklarálására használt kulcsszó. A névváltozó típusa megegyezik a hozzá rendelt érték típusával.
Példák:
Hogyan látjuk a kódot | Amit a fordító lát |
---|---|
|
|
|
|
|
|
|
|
|
|
A fordító maga határozza meg vagy következtet a változó típusára a hozzá rendelt érték alapján.
A programozók heves vitákat folytattak arról, hogy hozzáadjanak-e egy ilyen funkciót a nyelvhez. Sokan attól tartottak, hogy ezzel var
visszaélnek, és emiatt a kód olvashatósága megsérül.
Ebben van egy kis igazság, ezért a legjobb ott használni, var
ahol ez növeli a kód olvashatóságát. Például ezek két esetben:
1. eset: Ha megnézzük a változóhoz rendelt értéket, azonnal egyértelmű a változó típusa
Kód | Magyarázat |
---|---|
|
A változó egyInputStream |
|
A változó aString |
Ezekben az esetekben nem szabad használni var
. Nos, mi a változó típusa?
Kód | Magyarázat |
---|---|
|
Nehéz meghatározni a változó típusát |
|
Nehéz meghatározni a változó típusát |
2. eset: A változó típusa nem fontos a kód megértéséhez
A kódnak gyakran nincs szüksége metódusok meghívására egy változón, pl. amikor egy változót egyszerűen valami ideiglenes tárolására használnak. Ebben az esetben a használat var
határozottan nem csökkenti a kód olvashatóságát:
Hosszú kód | Kompakt kód |
---|---|
|
Metaadatokat kaptunk az stream adatfolyamból, és elmentettük az storage adattárba. A data változó konkrét típusa nem fontos. |
Az arany középút
Most háromféleképpen írhatom le ugyanazt a kódot. Használata var
lenne a legjobb megoldás.
Kód | jegyzet |
---|---|
|
Túl kompakt |
|
Pont jó |
|
Túl részletes |
Az 1 soros verzióról a 2 soros verzióra áttérve egy változónév ( ) használatával kicsit olvashatóbbá tettük a kódot headerInfo
. Most már világos, hogy a metódus nem csak metainformációkat ad vissza, hanem fejléc információkat is.
A harmadik verzió túlságosan bőbeszédű. Az a tény, hogy headerInfo
a, FileMetaInfo
már eléggé világos a módszerből getFileMetaInfo()
. A metainformáció célja sokkal érdekesebb.
3. A típus elhagyása a gyémánt operátorral:<>
Már az operátor megjelenése előtt is var
voltak kísérletek arra, hogy megtanítsák a fordítót a gyűjteménytípusok kikövetkeztetésére. Ön egyetért abban, hogy ez a jelölés kissé feleslegesnek tűnik:
ArrayList<String> list = new ArrayList<String>();
A Java hetedik verziójától kezdve egy gyűjteménytípus írásakor elhagyható a gyűjteményelemek típusa, ha azt a változó deklarálásakor megadtuk. Más szavakkal, a fenti kód enyhén lerövidített formában írható:
ArrayList<String> list = new ArrayList<>();
Amint látja, többé nem kell másodszor írni a String-et. Nem olyan menő, mint a var operátornál, de akkoriban előrelépésnek tűnt.
A kollekciótípus üres szögletes zárójeleit gyémánt operátornak nevezték , mivel a két saroktartó homályosan hasonlít egy gyémántra.
var
Nem kívánatos a kulcsszó és a gyémánt operátor egyidejű használata :
var list = new ArrayList<>();
A gyűjteményben tárolt elemek típusáról egyáltalán nincs információ, a gyűjtemény típusa ArrayList < Object > lesz.
4. Dupla göndör nadrágtartó
Emlékszel a gyors tömb inicializálására?
Csak az értékeket soroltuk fel göndör kapcsos zárójelben, például:
Példák |
---|
|
|
A Java készítői szerették a göndör kapcsos zárójelek használatát a tömb íráselemeinek egyszerűsítésére. De mi a helyzet a gyűjteményekkel?
A Java készítőinek a kollekciókhoz is elég kreatív gondolkodásuk volt, lehetővé téve számukra a dupla göndör kapcsos fogszabályzós trükk használatát.
Cukorral | Cukor nélkül |
---|---|
|
|
Ha a fordító olyan kóddal találkozik, mint a bal oldali példában, akkor azt konvertálja a jobb oldali kódra.
A kód nem lesz sokkal tömörebb. A megtakarítás itt meglehetősen jelentéktelen: nem kell list
minden alkalommal írni. Ez akkor lehet hasznos, ha a változó neve nagyon hosszú.
De ha egy projektben ilyen kóddal találkozol, ne lepődj meg 🙂