val e var vengono entrambi utilizzati per dichiarare variabili, ma hanno differenze fondamentali:
val number = 42 // number = 10 // errore!
var counter = 0 counter++ // consentito
Sicurezza e prestazioni:
val ovunque la variabile non debba cambiare — questo protegge da modifiche accidentali e rende il codice più facile da capire.val consente al compilatore e all'IDE di catturare errori in fase di compilazione e ottimizzare il codice.Un oggetto dichiarato come
valpuò essere modificato?
Risposta: Il valore stesso della variabile (riferimento) non può essere riassegnato, ma se si tratta di un oggetto (ad esempio, una lista), il suo stato interno può essere cambiato.
val list = mutableListOf(1,2) list.add(3) // Consentito! Ma list = altroElenco darà errore.
Storia
Nel progetto di un negozio online, uno sviluppatore ha definito la lista dei prodotti come
val items = mutableListOf<Product>(), pensando che in questo modo la lista fosse completamente immutabile. In realtà, in un'altra parte è stata modificata la lista (aggiunto un nuovo elemento), il che ha influenzato inaspettatamente la visualizzazione del carrello.
Storia
Nel parser di grandi file di testo, il buffer array è stato dichiarato come
var buffer, anche se durante il parsing non era necessario sostituirlo. È avvenuta accidentalmente una riassegnazione a un nuovo array, portando a una perdita di memoria e a un'elaborazione errata dei dati.
Storia
Nel codice di un microservizio, la maggior parte delle variabili era dichiarata come
var"per precauzione", il che ha portato a cambiare lo stato dell'oggetto in espressioni grandi in diversi thread, causando bug difficili da individuare a causa di condizioni di gara.