JAVA – Wnioskowanie typów zmiennych lokalnych

,
Czas czytania: 3 minut

Od lat Java w stosunku do innych języków programowania, takich jak Scala, Kotlin, Groovy czy C# była uważana za nie co antyczną, jeśli chodzi o wnioskowanie typów oraz możliwości programowania funkcyjnego. Sytuacja nie co się zmieniła w momencie wejścia Javy w wersji 8. Twórcy Javy dodali tam Stream’y czy też wyrażenia Lambda. Jednak nadal w Javie brakowało dynamicznego typowania zmiennych, tak jak to ma miejsce we wcześniej wymienionych językach programowania. Dodatkowo warto dodać, że Kotlin, Scala i Groovy są wykonywanie na JVM, w taki sam sposób jak Java a mimo to posiadały taką funkcjonalność.

W końcu z pomocą przyszła nam Java 10, która wprowadziła nowy feature — słowo kluczowe var. Dzięki niemu możemy w łatwy sposób używać wnioskowania typów zmiennych lokalnych. Ta funkcjonalność została dodana do Javy 10 w JEP 286: Local-Variable Type Inference. Niestety to słowo kluczowe, chociaż nie jest to tak naprawdę typowe słowo kluczowe, ale o tym później, ma też swoje ograniczenia i użycie tego mechanizmu typowania zmiennych nie jest jeszcze możliwe na tak szerokim poziomie, jak w przypadku Kotlina czy Grooviego.


Wnioskowanie typów – przykład użycia var

//string declaration without var keyword
String someText = "This is another post on AraSoftware.pl";

//string declaration with var keyword
var someText2 = "This is another post on AraSoftware.pl";

Użycie var w Javie 10 jest ograniczone do zmiennych lokalnych. Nie możemy zadeklarować pola w klasie, które będzie typu var. Taka operacja zakończy się błędem podczas kompilacji kodu.

public class SomeClass {
  
  String someField = "some string value";
  var anotherField = 10; // compilation time error

  public void someMethod() {
    var localVariable = 10; // this var keyword usage is allowed
    var var  = 10; // this is allowed but strange usage 
    /**
      .
      .
      .
      method body
    **/
  }
}

Jak napisałem we wstępie, nie jest to typowe słowo kluczowe. Jest to jedynie rezerwacja nazwy typu. Samo zastąpienie typu zmiennej na słowo var na pierwszy rzut oka nie przynosi jakichś znaczących usprawnień. Mimo to warto to stosować w momencie, gdy typ zmiennej lokalnej nie ma znaczenia w kontekście zrozumienia kodu przez programistę.

Kolejną zaletą stosowania var jest skracanie kodu. Możemy zastąpić typy generyczne, które często posiadają całkiem długą składnię, co znacząco utrudnia czytanie kodu.

//without var keyword usage
try (Stream<Post> postItem = dbConnection.executeQuery(sql)) {
  //do something with postItem variable
}

//with var keyword usage
try (var postItem = dbConnection.executeQuery(sql)) {
  //do something with postItem variable
}

Kolejnym ograniczeniem stosowania var jest to, że nie można go stosować zamiennie podczas deklaracji zwracanego typu przez metodę. Tutaj musimy użyć void lub innego typu poza var. To samo dotyczy się do parametrów metody. Nie możemy tam używać var ze względu na to, że kompilator na etapie kompilacji nie będzie w stanie wywnioskować jaki typ danych powinien się tam znaleźć.

public class SomeClass {
  
  public var someMethod() { // not allowed var usage
    //method body
  }

  public void someMethod(var parameter) { // not allowed var usage
    //method body
  } 
}


Podsumowanie

Mechanizm wnioskowania typów zmiennych w Javie 10 nie jest idealny, ale i tak wprowadza już pewne udogodnienie dla programistów. Nie da się ukryć, że wpływa na czytelność i długość pisanego kodu. Jednak moim zdaniem pozostaje jedynie miłym dodatkiem, a nie rewolucyjnym rozwiązaniem. Ograniczenia wynikają głównie z zachowania kompatybilności wstecznej. Uważam, że jest to krok w dobrym kierunku. Mam też nadzieję, że wraz z kolejnymi wersjami Javy zostaną wprowadzone mechanizmy pozwalające nam na jeszcze więcej.


Podobał Ci się ten artykuł? Chcesz więcej? Dodaj komentarz, udostępnij lub polajkuj fanpage AraSoftware na Facebook!

Czy ten post był dla Ciebie pomocny?

Kliknij na gwiazdki żeby zagłosować.

Średnia ocena 5 / 5. Liczba głosów: 2

Brak głosów do tej pory. Bądź pierwszy(a)!

Bardzo mi przykro że ten post nie był dla Ciebie pomocny 🙁

Pozwól mi poprawić ten post!

Powiedz mi co mogę poprawić?