Wpis z mikrobloga

Hej,

Jaka jest Wasza opinia na temat var w javie? W pracy nie widzę, żeby ktoś tego używał i próbuję sobie featury z kolejnych wersji języka i ciężko mi znaleźć jakiś sensowny powód używania tego. Co więcej, mam wrażenie, że przez używanie varów więcej czasu poświęcam na analizę nowego kodu bo muszę się zastanawiać co jakim jest typem.

Rekrutuję się teraz do firmy, gdzie jest sporo pasjonatów i pewnie mnie o to zapytają na rozmowie, więc chce mieć sensowną odpowiedź na pytanie kiedy bym użył, czy to jest jakiś game changer itd xD

Znalazłem taki przykład:
zamiast: Record4<Integer, String, LocalDate, Long> s1 = select(A, B, C, D).from(T);
to: var s1 = select(A, B, C, D).from(T);
No ok, tutaj nie musimy pisać pierdyliarda typów, o których nie musimy wiedzieć.

Ale np. taki przykład do mnie nie przemawia:
var emails = this.emailService.fetchEmailsForUser(user);
Nie raz musiałbym kliknąć w implementacje metody żeby sprawdzić co zwraca.

Takie coś ujdzie, ale nie wiem czy nie wolałbym mieć widzieć typ, może przyzwyczajenie? xD
for (var entry : someMap.entrySet()) {
Customer c = entry.getKey();
List<Address> addresses = entry.getValue();

}

Szkoda, że to nie jest dynamiczne typowanie i dalej nie możemy zrobić:
var zmienna = "janek";
zmienna = 3; //error

#java #naukaprogramowania #programowanie
  • 12
Sam nie byłem do tego przekonany, ale w IDEI np. jest highlight co zwraca dana funkcja w przypadku użycia var, nie widać tego jedynie np. na githubie (choć to też pewnie kwestia czasu aż zacznie to być wspierane, choćby przy użyciu AI). W takim wypadku review kodu należy robić w IDE, ale od pewnego momentu zauważyłem, że jest to nawet lepsze, bo takich feature'ów będzie pewnie przybywać, bo teraz przy dużym systemie
Szkoda, że to nie jest dynamiczne typowanie i dalej nie możemy zrobić:


@mirek_dev: przypisywanie wielu różnych zmiennych do tej samej nazwy utrudnia analizę kodu, bo ta sama nazwa zmienia swój kontekst w zależności od tego w której linijce jesteśmy. Do tego dynamiczne typowanie mało tu zmienia: można spokojnie zrobić język, gdzie kompilator ukryje starą zmienną i wprowadzi nową tak, że mamy zachowane statyczne typownie. Po prostu nikt tego nie robi, bo
i co zmieni typ? Dostaniesz nazwę, która tak ci nic nie mówi, bo trzeba skoczy do klasy, żeby zobaczyć co się dzieje.


@Saly: var emails = this.emailService.fetchEmailsForUser(user);
Skąd mam wiedzieć czy to jest set czy lista czy może ktoś nieudolnie władował jakąś inną strukturę, a ja muszę te emaile teraz wyfiltrować, jeśli mam List<String> emails = ...to od razu wiem co robić, przy varze muszę wejść w implementację metody (no albo
@Nofenak: final var to semantycznie dobry pattern, bo jasno deklarujesz, że referencja się nigdy nie zmieni. Niestety Java jest trochę upośledzona i też bym powiedział, że w praktyce to raczej antipattern, bo poświęcanie na to 8 znaków to przesada i psuje trochę flow podczas czytania kodu. Lombok pozwala chyba osiągnąć to samo słówkiem "val" podobnie jak Kotlin czy Scala.
@Nofenak: To ja się nie zgadzam. W korpo-Javie, gdzie nazwy zmiennych i metod potrafia skladac sie w kilku czlnow (typu findActiveSubscriptionsByUser), mozliwosc wyrzucenia typow z kodu poprawia czytelnosc. Poza tym w sensownie napisanym kodzie typy beda w wielu przypadkach oczywiste i w kazdym normalnym IDE typ mozna sobie sprawdzic jednym klawiszem ¯\(ツ)/¯