Val e Var a Kotlin


289

Qual'è la differenza tra vare valin Kotlin?

Ho attraversato questo link:

https://kotlinlang.org/docs/reference/properties.html

Come indicato su questo link:

La sintassi completa di una dichiarazione di proprietà di sola lettura differisce da una mutabile in due modi: inizia con val anziché var e non consente un setter.

Ma poco prima c'è un esempio che usa un setter.

fun copyAddress(address: Address): Address {
    val result = Address() // there's no 'new' keyword in Kotlin
    result.name = address.name // accessors are called
    result.street = address.street
    // ...
    return result
}

Qual è la differenza esatta tra vare val?

Perché abbiamo bisogno di entrambi?

Questo non è un duplicato di Variabili in Kotlin, differenze con Java. var vs val? come sto chiedendo riguardo al dubbio relativo al particolare esempio nella documentazione e non solo in generale.


4
resultnon può essere modificato per fare riferimento a un'istanza diversa di Address, ma l'istanza a cui fa riferimento può ancora essere modificata. Lo stesso sarebbe vero in Java se avessi unfinal Address result = new Address();
Michael


Sono venuto qui per la risposta perché il sito Web di Kotlin che per primo descrive le variabili era troppo stupido per menzionarlo lì: kotlinlang.org/docs/reference/basic-syntax.html
AndroidDev

Risposte:


239

Nel tuo codice resultnon sta cambiando, le sue varproprietà stanno cambiando. Fare riferimento ai commenti seguenti:

fun copyAddress(address: Address): Address {
    val result = Address() // result is read only
    result.name = address.name // but not their properties.
    result.street = address.street
    // ...
    return result
}

valè lo stesso del finalmodificatore in Java. Come probabilmente dovresti sapere che non possiamo assegnare di finalnuovo a una variabile ma possiamo cambiarne le proprietà.


1
val e var in funzione e classi o nel costruttore principale hanno significato diverso?

3
@Niente No, ovunque è lo stesso.
chandil03,

Ma quando dichiaro variabile con var nella classe, ha richiesto l'inizializzazione perché dichiara la proprietà. Ma nella funzione non è richiesta l'inizializzazione perché?

Perché quando la classe viene caricata in memoria, vengono valutate anche le sue proprietà. Ma le variabili di funzione vengono valutate quando viene eseguito il codice di funzione.
chandil03,

La sua media sia all'interno della funzione o all'interno della classe sia parola chiave vale varsono usati per dichiarare le proprietà? non variabile?

142

valed varentrambi sono usati per dichiarare una variabile.

var è come una variabile generale ed è nota come variabile mutabile in kotlin e può essere assegnata più volte.

val è come la variabile finale ed è noto come immutabile in kotlin e può essere inizializzato solo una volta.

Per ulteriori informazioni, cos'è vale si varprega di consultare il link qui sotto

http://blog.danlew.net/2017/05/30/mutable-vals-in-kotlin/


23

le variabili definite con var sono mutabili (lettura e scrittura)

le variabili definite con val sono immutabili (sola lettura)

Kotlin può rimuovere findViewById e ridurre il codice per setOnClickListener in Android Studio. Per un riferimento completo: fantastiche funzionalità di Kotlin

il valore delle variabili mutabili può essere modificato in qualsiasi momento, mentre non è possibile modificare il valore delle variabili immutabili.

dove dovrei usare var e dove val?

usa var dove il valore cambia frequentemente. Ad esempio mentre si ottiene la posizione del dispositivo Android

var integerVariable : Int? = null

usa val dove non vi è alcuna variazione di valore nell'intera classe. Ad esempio, si desidera impostare la visualizzazione di testo o il testo del pulsante a livello di codice.

val stringVariables : String = "Button's Constant or final Text"

17
"Kotlin può rimuovere findViewById e ridurre il codice per setOnClickListener in Android Studio. Per un riferimento completo: caratteristiche fantastiche di Kotlin" In che modo è rilevante per la domanda?
denvercoder9

4
le variabili val non sono necessariamente immutabili. Sono definitivi - solo il riferimento è immutabile - ma se l'oggetto memorizzato nella val è mutabile, l'oggetto è mutabile indipendentemente dal fatto che sia assegnato tramite val o var.
Travis,

non vedo il punto di introdurre due nuove parole chiave mentre si potrebbe fare molto meglio comprensibilmente in precedenza in Java
ruben

18

valusare per dichiarare la variabile finale. Caratteristiche delle valvariabili

  1. Deve essere inizializzato
  2. il valore non può essere modificato o riassegnato inserisci qui la descrizione dell'immagine

var è come una variabile generale

  1. Possiamo inizializzare in seguito utilizzando lateinit modificatore

    [lateinit usa anche per variabile globale non possiamo usarlo per variabile locale]

  2. il valore può essere modificato o riassegnato ma non nell'ambito globale

inserisci qui la descrizione dell'immagine

valin kotlinè come una finalparola chiave in java


12

Semplicemente, var (mutabile) e val (valori immutabili come in Java (modificatore finale))

var x:Int=3
x *= x

//gives compilation error (val cannot be re-assigned)
val y: Int = 6
y*=y



11
+----------------+-----------------------------+---------------------------+
|                |             val             |            var            |
+----------------+-----------------------------+---------------------------+
| Reference type | Immutable(once initialized  | Mutable(can able to change|
|                | can't be reassigned)        | value)                    |
+----------------+-----------------------------+---------------------------+
| Example        | val n = 20                  | var n = 20                |
+----------------+-----------------------------+---------------------------+
| In Java        | final int n = 20;           | int n = 20;               |
+----------------+-----------------------------+---------------------------+

Riferimento


8

Puoi facilmente pensarlo come:

var viene utilizzato per il setter (il valore cambierà).

val è usato per getter (sola lettura, il valore non cambierà).


8

Se dichiariamo variabile usando valallora sarà variabile di sola lettura . Non possiamo cambiarne il valore. È come la variabile finale di Java . Suoimmutable .

Ma se dichiariamo la variabile usando varallora sarà una variabile che possiamo leggere o scrivere . Possiamo cambiare il suo valore. Lo è mutable.

data class Name(val firstName: String, var lastName: String)

fun printName(name: Name): Name {
    val myName = Name("Avijit", "Karmakar") // myName variable is read only
    // firstName variable is read-only. 
    //You will get a compile time error. Val cannot be reassigned.
    myName.firstName = myName.firstName
    // lastName variable can be read and write as it's a var.
    myName.lastName = myName.lastName
    return myName
}

valnon può essere inizializzato di recente dalla parola chiave, lateinitma non primitivo varpuò essere inizializzato di recente dalla parola chiave lateinit.


val e var in funzione e classi o nel costruttore principale hanno significato diverso?

8

Fondamentalmente

  • var= variabile , quindi può cambiare
  • val= valore , quindi non può cambiare.

8

In Kotlin valè una proprietà di sola lettura ed è accessibile solo da un getter. valè immutabile.

val esempio :

val piNumber: Double = 3.1415926
    get() = field

Tuttavia, varè una proprietà di lettura e scrittura , quindi è possibile accedervi non solo da un getter ma anche da un setter. varè mutevole.

var esempio :

var gravity: Double = 9.8
    get() = field
    set(value) { 
        field = value 
    }    

Se provi a cambiare un immutabile val, IDE ti mostrerà un errore:

fun main() {    
    piNumber = 3.14          // ERROR
    println(piNumber)
}

// RESULT:   Val cannot be reassigned 

Ma un mutabile varpuò essere cambiato:

fun main() {    
    gravity = 0.0
    println(gravity)
}

// RESULT:   0.0

Spero che questo ti aiuti.


4

La proprietà val è simile alla proprietà finale in Java. Puoi assegnare un valore solo per una volta. Quando si tenta di riassegnarlo con un valore per la seconda volta, viene visualizzato un errore di compilazione. Considerando che la proprietà var è mutevole, che sei libero di riassegnare quando lo desideri e per tutte le volte che vuoi.


4

Devi modificare una variabile o impostarla in modo permanente?

  • Un buon esempio se è qualcosa di simile a val pi5places = 3.14159 lo imposteresti come val. C'è la possibilità che tu debba cambiare quella variabile ora o più tardi, quindi la imposteresti come var.

  • Ad esempio: il colore di un'auto può essere var colorCar = green. Più tardi puoi cambiarlo colorCar = blue, dove come val, non puoi.

  • Le risposte qui riguardanti mutablee immutablevanno bene, ma possono essere spaventose se questi termini non sono ben conosciuti o se si sta semplicemente imparando a programmare.


3

Il valore della valvariabile può essere assegnato una sola volta.

val address = Address("Bangalore","India")
address = Address("Delhi","India") // Error, Reassigning is not possible with val

Sebbene non sia possibile riassegnare il valore ma è possibile modificare sicuramente le proprietà dell'oggetto.

//Given that city and country are not val
address.setCity("Delhi") 
address.setCountry("India")

Ciò significa che non è possibile modificare il riferimento all'oggetto a cui punta la variabile ma è possibile modificare le proprietà sottostanti di quella variabile.

Il valore della variabile var può essere riassegnato tutte le volte che vuoi.

var address = Address("Bangalore","India")
address = Address("Delhi","India") // No Error , Reassigning possible.

Ovviamente, è possibile modificare le proprietà sottostanti purché non vengano dichiarate val.

//Given that city and country are not val
address.setCity("Delhi")
address.setCountry("India")


2

valcome constantvariabile, di per sé non può essere modificato, può solo essere letto, ma le proprietà di a valpossono essere modificate; varproprio come la variabile mutante in altri linguaggi di programmazione.


2

val è immutabile, finale, il primo valore assegnato non può essere modificato.

val name:String = "andy"

name = "thomas" //Error: Val cannot be reassigned

var è modificabile, riassegnabile, è possibile modificare il valore più e più volte.

val a:Int = 1
var b:Int = 1
println("${a + b}") // output 2

b = 4
println("${a + b}") // output 5

Penso che il modo più semplice per ricordarlo:

val = variabile finale

var = variabile riassegnabile o l'opposto di val.


La domanda è sulla differenza tra due, non su come differenziare il bot. Si prega di passare attraverso il collegamento sotto che vi aiuterà a pubblicare buone risposte stackoverflow.com/help/how-to-answer
Prasoon Karunan V

Quindi preferisci la stessa risposta, anche se molte persone hanno risposto a questa domanda. E per alcune persone nuove a Kotlin, val e var suonano allo stesso modo. Quindi devi dare loro un esempio di come differenziarlo e cosa sono. Ma sì, seguirò il tuo consiglio. Grazie.
Wahyu Anggara Raya,

1

Entrambi vale varpossono essere utilizzati per dichiarare variabili (proprietà locali e di classe).

Variabili locali :

  1. valdichiara variabili di sola lettura che possono essere assegnate una sola volta, ma non possono essere riassegnate .

Esempio:

val readonlyString = “hello”
readonlyString = “c u” // Not allowed for `val`
  1. vardichiara variabili riassegnabili quando le conosci da Java (la parola chiave verrà introdotta in Java 10, "inferenza del tipo di variabile locale" ).

Esempio:

var reasignableString = “hello”
reasignableString = “c u” // OK

È sempre preferibile usare val. Cerca di evitare il varpiù spesso possibile!

Proprietà della classe :

Entrambe le parole chiave vengono utilizzate anche per definire le proprietà all'interno delle classi . Ad esempio, dai un'occhiata a quanto segue data class:

data class Person (val name: String, var age: Int)

Il Personcontiene due campi, uno dei quali è readonly ( name). La age, d'altra parte, può essere riassegnato dopo classe istanza, tramite l'apposito setter. Nota che namenon avrà un metodo setter corrispondente.


1

Entrambe le variabili vengono utilizzate come inizializzazione

  • val come una variabile costante, può essere leggibile e le proprietà di una val possono essere modificate.

  • var proprio come una variabile mutabile. puoi modificare il valore in qualsiasi momento.


1

In breve, la variabile val è finale (non modificabile) o il valore costante che non verrà modificato in futuro e la variabile var (mutabile) può essere modificata in futuro.

class DeliveryOrderEvent(val d : Delivery)
// Only getter

Vedi il codice sopra. È una classe modello, verrà utilizzata per il passaggio di dati. Ho impostato val prima della variabile perché questa variabile è stata utilizzata per ottenere i dati.

class DeliveryOrderEvent(var d : Delivery)

// setter and getter is fine here. No error

Inoltre, se è necessario impostare i dati in un secondo momento, è necessario utilizzare la parola chiave var prima di una variabile, se è necessario ottenere il valore solo una volta, utilizzare la parola chiave val


1

Normale

  • Valsta usando per staticcampo come in Java comeStatic Keyword

  • Come Staticin Java / Come in kotlin

  • E Varindica Campo variabile in Kotlin che, puoi cambiarlo.

  • Principalmente Staticviene utilizzato quando si desidera salvare immediatamente il valore nella memoria statica,

Esempio:

 if you assign

 val a=1
 a=3  You can not change it 
  • Non puoi cambiare, questo è il valore finale e statico

    var b=2

    b=4 Puoi cambiarlo


1

val: deve aggiungere o inizializzare un valore ma non può cambiare. var: la sua variabile può essere modificata in qualsiasi riga del codice.


1

In kotlin possiamo dichiarare la variabile in due tipi: vale var. valnon può essere riassegnato, funziona come una variabile finale.

val x = 2
x=3 // cannot be reassigned

D'altra parte, var può essere riassegnato è mutabile

var x = 2
x=3 // can be reassigned

0

Entrambe sono variabili, l'unica differenza è quella variabile mutabile e variabile immutabile e non c'è più differenza. var è una variabile mutabile e val è immutabile. In linguaggio semplice var può cambiare è valore dopo l'inizializzazione il valore val è costante e non può modificarlo dopo l'inizializzazione del valore.


0

val(dal valore): riferimento immutabile. Una variabile dichiarata con valnon può essere riassegnata dopo essere stata inizializzata. Corrisponde a una finalvariabile in Java.

var(dalla variabile): riferimento mutabile. Il valore di tale variabile può essere modificato. Questa dichiarazione corrisponde a una normale (non definitiva) variabile Java.


0

Var significa Variabile -Se hai memorizzato qualsiasi oggetto usando 'var' , potrebbe cambiare nel tempo.

Per esempio:

fun main(args: Array<String>) {
    var a=12
    var b=13
    var c=12
    a=c+b **//new object 25**
    print(a)
}

Val significa valore -È come una 'costante' in Java. Se memorizzi qualsiasi oggetto usando 'val', non potrebbe cambiare nel tempo.

Per esempio:

fun main(args: Array<String>) {
    val a=12
    var b=13
    var c=12
    a=c+b **//You can't assign like that.it's an error.**
    print(a)
}

0

VAR viene utilizzato per creare quelle variabili il cui valore cambierà nel corso del tempo nell'applicazione. È lo stesso di VAR di swift, mentre VAL viene usato per creare quella variabile il cui valore non cambierà nel corso del tempo nella tua applicazione. È lo stesso di LET di swift.


0

val - Immutabile (una volta inizializzato non può essere riassegnato)

var - Mutabile (può cambiare valore)

Esempio

in Kotlin - val n = 20 & var n = 20

In Java - final int n = 20; & int n = 20;


0

var è una variabile mutabile e può essere assegnata più volte e val è una variabile immutabile e può essere inizializzata solo una volta.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.