Az ismétlés a tanulás anyja. Bár korábban már beszéltünk a Java switch kulcsszóról, ma áttekintjük az alapokat, és beleásunk néhány új információba.
A Java kétféle switch konstrukcióval rendelkezik: a switch utasítás és a switch kifejezés. A switch kifejezés a Java 14-ben vált hivatalossá, miután két nem hivatalos "előzetes" változatban létezett a 12-es és 13-as verziókban.
De kezdjük elölről. Idézzük fel, hogyan nézett ki egy jó öreg kapcsoló a 12-es verzió előtt:
public String getProductTypeByName(String product) {
String productType = "";
switch (product) {
case "Apple":
productType = "Fruit";
break;
case "Peach":
productType = "Fruit";
break;
case "Raspberry":
productType = "Berry";
break;
case "Cherry":
productType = "Berry";
break;
case "Tomato":
productType = "Vegetable";
break;
default:
productType = "other";
break;
}
return productType;
}
A switch utasítás konstrukciók halmaza, amelyek egymás után kerülnek végrehajtásra. Nem engedi visszaadni az értéket. A switch utasítás használatával a fő probléma az, hogy végtelen számú esetkifejezést adhat hozzá , és ezzel a képességgel a programozók gyakran visszaélnek.
A Java 12 egy kísérleti funkcióval bővült: a switch új verziójával – nem switch utasítással, hanem switch kifejezéssel –, amely értéket adhat, funkcionális programozást használhat belsőleg, és egyesítheti a közös értékkel rendelkező esetutasításokat, ezáltal kompakt konstrukció.
Java 12-ben a getProductTypeByName() metódus a következőképpen írható át :
public String getProductTypeByName(String product) {
return switch (product) {
case "Apple", "Peach" -> "Fruit";
case "Raspberry", "Cherry" -> "Berry";
case "Tomato" -> "Vegetable";
default -> "other";
};
}
Most a kód tisztábbnak tűnik. A funkcionális programozásból származó nyíl szintaxis lehetővé teszi, hogy a break kulcsszó nélkül adjunk vissza értékeket, és általában a váltás végrehajtásának eredménye elmenthető egy változóba, vagy visszaadható a return kulcsszóval.
Ha nem csak egy eredményt kell visszaadnunk, hanem több soros kóddal is rendelkeznünk kell, akkor a kapcsolónk így néz ki:
public String getProductTypeByName(String product) {
var result = switch (product) {
case "Apple", "Peach" -> {
System.out.println("This is a Fruit");
break "Fruit";
}
case "Raspberry", "Cherry" -> {
System.out.println("This is a Berry");
break "Berry";
}
case "Tomato" -> {
System.out.println("This is a Vegetable");
break "Vegetable";
}
default -> {
break "other";
}
};
return result;
}
A Java 13-ban a switch kifejezés még csak kísérleti funkció volt. Ahhoz, hogy elérhetővé váljon, csakúgy, mint a Java 12-ben, az --enable-preview parancsot kell használnia fordításkor és futtatásakor. A Java 13-ban a switch fő, és lényegében egyetlen "innovációja" a hozam kulcsszó, amely a break kifejezést váltotta fel .
public String getProductTypeByName(String product) {
var result = switch (product) {
case "Apple", "Peach" -> {
System.out.println("This is a Fruit");
yield "Fruit";
}
case "Raspberry", "Cherry" -> {
System.out.println("This is a Berry");
yield "Berry";
}
case "Tomato" -> {
System.out.println("This is a Vegetable");
yield "Vegetables";
}
default -> {
System.out.println("Other");
yield "other";
}
};
return result;
}
A fő különbség a hozam és a break között az, hogy a break végrehajtási vezérlést ad vissza egy case utasításból, de a return a teljes switch eredményét adja vissza , belső return utasításként viselkedve.
A Java 14-ben az instanceof operátor megváltozott, és most így használható:
if (o instanceof String s) {
s.toLowerCase();
}
A kissé csúnya régi módszer helyett, ahol nemcsak ellenőrizni kellett a változót az instanceof segítségével , hanem egy adott típusra is át kellett adni.
if(s instanceof String) {
((String) s).toLowerCase();
}
Ezek a változtatások az Amber projekt részét képezik, amelynek célja a Java mintaillesztési támogatása.
A 14-es verzióban az instanceof operátor változásának és a 16-os verzió kiterjesztésének köszönhetően a mintaillesztés végül is bekerült a 17-es verzióba. Igaz, egyelőre csak előzetesként létezik. Kipróbálhatod az --enable-preview segítségével :
public String getObjectType(Object object) {
return switch (object) {
case Integer i -> "Integer";
case Long l -> "Long";
case String s -> "String";
default -> object.toString();
};
}
Általánosságban elmondható, hogy minden új verzió egyre több érdekességet visz be a nyelvbe, ami még menőbbé teszi a Java fejlesztést.
GO TO FULL VERSION