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
  • Odpowiedz
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
  • Odpowiedz
Szkoda, że to nie jest dynamiczne typowanie i dalej nie możemy zrobić:

var zmienna = "janek";

zmienna = 3; //error

@mirek_dev: całe szczęście ze nie jest

Jeżeli widać po nazwie/kontekście co metoda zwróci, to można imo dać vara, w innych przypadkach mysle ze lepiej deklarować typ
  • Odpowiedz
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
  • Odpowiedz
  • 0
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
  • Odpowiedz
@mirek_dev: W poprzedniej pracy używaliśmy razem z final a ostatnio na rozmowie rekrutacyjnej gość tłumaczył mi, że to antypattern i przez 10 lat pracy nie widział użycia tego
  • Odpowiedz
@mirek_dev: używam wtedy, gdy pisanie typu mija się z celem, bo i tak wiadomo, jaki jest, np.

var l = List.of(1, 2, 3)
ale w pozostałym wolę widzieć typ, np.

var x = myObject.foo();

SomeResult x2 = myObject.foo(); // lepsze
  • Odpowiedz
@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.
  • Odpowiedz
@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 ¯\(ツ)/¯
  • Odpowiedz