Java 10 – czyli “var” na pokładzie

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.

  • Ponad 10 lat po C#. Lepiej późno niż wcale.

    • T-Regx Developer

      Faktycznie smaczki składniowe C# miał pierwszy. Ale masa feature’ów ze kolekcjami, stream’ami, programowaniem funkcyjnym, wątkami, niezliczone inne były w javie dużo wcześniej.