Jakiś czas temu opisywałem featury z Javy 9, tymczasem 20 marca została wydana Java w wersji 10. Po raz kolejny nie wprowadza ona tak dużych zmian jak wersja 8, jednakże pojawił się ciekawy feature zwany “local variable type inference“. Java pomimo, iż jest językiem statycznie typowanym, od wersji 10 pozwala nam na lekkie złamanie tej obietnicy, zapraszam!
Local variable type inference
Wyobraźmy sobie obiekt biznesowy Car
. Tworzymy zmienną lokalną someCar
typu Car
:
Car someCar = new Car();
Jeśli przyjrzymy się powyższej linii, zauważymy, iż fragment Car
jest powtórzony dwa razy. W Javie 10 możemy zrobić tak:
var someCar = new Car();
Java stała się dynamicznie typowana? Oczywiście, że nie, natomiast pojawiło się usprawnienie w samej składni wyrażane słowem var
, dzięki któremu kompilator jest w stanie wywnioskować typ na podstawie prawej strony przypisania.
Zasady
Nowe usprawnienie składni ma też kilka zasad/ograniczeń:
Tylko zmienne lokalne
Jak sama nazwa (ang. local variable type inference) wskazuje, słowo var
może być używane tylko dla zmiennych lokalnych. Nie możemy używać tego słowa w definicji pól klas!
Natychmiastowe przypisanie
Wartość zadeklarowana jako var
musi być od razu przypisana:
var someCar; someCar = new Car(); // błąd
Zasada ta ogranicza nam tym samym możliwość jawnego przypisania wartości null
.
Pętle
Ponadto słowo var
można z powodzeniem używać w pętlach for
i for-each
:
for (var car : cars) { //logic } for (var i = 0; i < cars.size(); i++) { //logic }
Benefity
Według autorów najważniejszym benefitem tego usprawnienia jest czytelność i przyśpieszenie pisania. No właśnie, czy aby na pewno? Moim zdaniem tak, jednakże jest to kwestia indywidualna. Mam styczność również z innym językami i tam taka składnia jest normalnością. Ponadto, pojawienie się takiego usprawnienia jest kolejnym “marketingowym” krokiem, który ma skusić programistów innych języków do przejścia na jasną stronę Javianów. Czy sam będę korzystał z tego usprawnienia? Jak najbardziej tak, jednakże tylko w takich przypadkach, gdy nie zmniejszy to czytelności (na przykład, gdy zwracany typ nie ma dla mnie znaczenia), a jedynie ją poprawi.
Co jeśli gdzieś używałem zmiennej o nazwie var?
Cały czas podczas pisania artykułu starałem się NIE napisać, iż słowo var
jest nowym słowem kluczowym w języku Java (mam nadzieję, że się udało). Ponieważ słowo var
jest tylko zarezerwowanym słowem dla typu, możemy go nadal używać jako nazwę pakietu, metody czy zmiennej. Jednakże nie może być użyte jako nazwa interfejsu czy klasy.
var someCar = new Car(); String var = "CodeCouple.pl";
W najlepszym przypadku możemy zrobić to tak:
var var = new Car();
Lombok
Jeśli chcielibyśmy skorzystać z tego udogodnienia, jednakże nie przenieśliśmy się jeszcze na najnowszą wersję Javy, możemy wykorzystać Lombok’a.
Ponadto
IntelliJ ma bardzo dobre wsparcie dla tego feature.