val i var - oba są używane do deklaracji zmiennych, ale mają zasadnicze różnice:
val number = 42 // number = 10 // błąd!
var counter = 0 counter++ // dozwolone
Bezpieczeństwo i wydajność:
val wszędzie tam, gdzie zmienna nie powinna się zmieniać - to chroni przed przypadkowymi zmianami i sprawia, że kod jest łatwiejszy do zrozumienia.val pozwala kompilatorowi i IDE wychwycić błędy na etapie kompilacji i optymalizować kod.Czy obiekt zadeklarowany jako
valmoż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.
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.