programowanieBackend developer

Jaka jest różnica między słowami kluczowymi "val" i "var" w Kotlinie? Jak optymalnie je używać pod względem bezpieczeństwa i wydajności kodu?

Zdaj rozmowy kwalifikacyjne z asystentem AI Hintsage

Odpowiedź.

val i var - oba są używane do deklaracji zmiennych, ale mają zasadnicze różnice:

  • val (wartość): deklaruje niemodyfikowalny, tylko do odczytu odnośnik. Po inicjalizacji wartość nie może być przypisana na nowo, odnośnik zawsze pozostaje na jeden obiekt:
val number = 42 // number = 10 // błąd!
  • var (zmienna): deklaruje zmienną, którą można zmieniać;
var counter = 0 counter++ // dozwolone

Bezpieczeństwo i wydajność:

  • Preferowane jest używanie val wszędzie tam, gdzie zmienna nie powinna się zmieniać - to chroni przed przypadkowymi zmianami i sprawia, że kod jest łatwiejszy do zrozumienia.
  • Użycie val pozwala kompilatorowi i IDE wychwycić błędy na etapie kompilacji i optymalizować kod.

Pytanie z zaskoczeniem.

Czy obiekt zadeklarowany jako val może być zmieniony?

Odpowiedź: Wartość samej zmiennej (odnośnik) nie może być przypisana na nowo, ale jeśli jest to obiekt (na przykład lista), jego wewnętrzny stan można zmieniać.

val list = mutableListOf(1,2) list.add(3) // Można! A oto list = innaLista będzie błędem.

Przykłady rzeczywistych błędów z powodu nieznajomości subtelności tematu.


Historia

W projekcie sklepu internetowego programista zdefiniował listę produktów jako val items = mutableListOf<Product>(), myśląc, że lista jest całkowicie niemodyfikowalna. W rzeczywistości w innej części lista została zmieniona (dodano nowy element), co niespodziewanie wpłynęło na wyświetlanie koszyka.


Historia

W parserze dużych plików tekstowych bufor tablicowy został zadeklarowany jako var buffer, chociaż podczas parsowania nie było potrzeby go zmieniać. Przypadkowo doszło do ponownego przypisania nowej tablicy, co doprowadziło do wycieku pamięci i niepoprawnego przetwarzania danych.


Historia

W kodzie jednego mikroserwisu większość zmiennych była deklarowana jako var "na wszelki wypadek", w rezultacie w dużych wyrażeniach czasami zmieniało się stan obiektu w różnych wątkach, co prowadziło do trudnych do uchwycenia błędów z powodu warunków wyścigu.