Val dan Var di Kotlin


288

Apa perbedaan antara vardan valdi Kotlin?

Saya telah melalui tautan ini:

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

Sebagaimana dinyatakan pada tautan ini:

Sintaks penuh dari deklarasi properti read-only berbeda dari yang bisa berubah dalam dua cara: ini dimulai dengan val bukan var dan tidak memungkinkan setter.

Namun sesaat sebelum ada contoh yang menggunakan 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
}

Apa perbedaan persis antara vardan val?

Mengapa kita membutuhkan keduanya?

Ini bukan duplikat dari Variabel di Kotlin, perbedaan dengan Java. var vs val? karena saya bertanya tentang keraguan terkait dengan contoh khusus dalam dokumentasi dan bukan hanya secara umum.


4
resulttidak dapat diubah untuk merujuk ke instance berbeda Address, tetapi instance yang merujuknya masih dapat dimodifikasi. Hal yang sama akan berlaku di Jawa jika Anda memilikifinal Address result = new Address();
Michael


Datang ke sini untuk jawabannya karena situs web Kotlin yang pertama kali menggambarkan variabel terlalu bodoh untuk menyebutkannya di sana: kotlinlang.org/docs/reference/basic-syntax.html
AndroidDev

Jawaban:


239

Dalam kode Anda resulttidak berubah, varpropertinya berubah. Lihat komentar di bawah ini:

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
}

valsama dengan finalpengubah di java. Karena Anda mungkin harus tahu bahwa kami tidak dapat menetapkan finalvariabel lagi tetapi dapat mengubah propertinya.


1
val dan var dalam fungsi dan kelas atau di konstruktor primer memiliki arti yang berbeda?

3
@Tidak ada, di mana-mana sama saja.
chandil03

Tetapi ketika saya mendeklarasikan variabel dengan var di kelas itu diperlukan inisialisasi karena menyatakan properti. Tetapi dalam fungsi itu tidak diperlukan inisialisasi mengapa?

Karena ketika kelas memuat ke dalam memori, propertinya juga akan dievaluasi. Tetapi dalam variabel fungsi dievaluasi ketika kode fungsi dijalankan.
chandil03

Artinya di dalam fungsi atau di dalam kelas kata kunci valdan vardigunakan untuk mendeklarasikan properti? bukan variabel?

142

valdan varkeduanya digunakan untuk mendeklarasikan variabel.

var seperti variabel umum dan itu dikenal sebagai variabel yang bisa berubah di kotlin dan dapat ditugaskan beberapa kali.

val seperti variabel Final dan dikenal sebagai tidak berubah di kotlin dan dapat diinisialisasi hanya satu kali.

Untuk informasi lebih lanjut apa itu valdan varsilakan lihat tautan di bawah ini

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


23

variabel yang didefinisikan dengan var dapat berubah (Baca dan Tulis)

variabel yang didefinisikan dengan val tidak dapat diubah (Hanya baca)

Kotlin dapat menghapus findViewById dan mengurangi kode untuk setOnClickListener di android studio. Untuk referensi lengkap: Fitur luar biasa Kotlin

nilai variabel yang dapat berubah dapat diubah kapan saja, sementara Anda tidak dapat mengubah nilai variabel yang tidak dapat diubah.

di mana saya harus menggunakan var dan di mana val?

gunakan var di mana nilainya sering berubah. Misalnya saat mendapatkan lokasi perangkat android

var integerVariable : Int? = null

gunakan val di mana tidak ada perubahan nilai di seluruh kelas. Misalnya Anda ingin mengatur textview atau teks tombol secara terprogram.

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

17
"Kotlin dapat menghapus findViewById dan mengurangi kode untuk setOnClickListener di android studio. Untuk referensi lengkap: Fitur mengagumkan Kotlin" Bagaimana ini relevan dengan pertanyaan yang diajukan?
denvercoder9

4
variabel val tidak selalu berubah. Mereka final - hanya referensi yang tidak dapat diubah - tetapi jika objek yang disimpan dalam val dapat berubah, objek tersebut dapat berubah tanpa memperhatikan apakah itu diberikan melalui val atau var.
Travis

saya tidak melihat titik memperkenalkan dua kata kunci baru sementara itu bisa dilakukan jauh lebih baik dimengerti sebelumnya di Jawa
ruben

18

valgunakan untuk mendeklarasikan variabel akhir. Karakteristik valvariabel

  1. Harus diinisialisasi
  2. nilai tidak dapat diubah atau ditugaskan kembali masukkan deskripsi gambar di sini

var adalah sebagai variabel umum

  1. Kita dapat menginisialisasi nanti dengan menggunakan lateinitpengubah

    [ lateinitJuga gunakan untuk variabel global kita tidak bisa menggunakannya untuk variabel lokal]

  2. nilai dapat diubah atau ditugaskan kembali tetapi tidak dalam lingkup global

masukkan deskripsi gambar di sini

valin kotlinseperti finalkata kunci in java


12

Sederhananya, var (dapat diubah) dan val (nilai yang tidak dapat diubah seperti di Java (pengubah akhir))

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;               |
+----------------+-----------------------------+---------------------------+

Referensi


8

Anda dapat dengan mudah menganggapnya sebagai:

var digunakan untuk setter (nilai akan berubah).

val digunakan untuk pengambil (read-only, nilai tidak akan berubah).


8

Jika kita mendeklarasikan variabel menggunakan valmaka itu akan menjadi variabel read-only . Kami tidak dapat mengubah nilainya. Ini seperti variabel final Java . Ini immutable.

Tetapi jika kita mendeklarasikan variabel menggunakan varmaka itu akan menjadi variabel yang bisa kita baca atau tulis . Kita bisa mengubah nilainya. Ini 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
}

valtidak dapat diinisialisasi akhir-akhir ini oleh kata kunci lateinittetapi non-primitif vardapat diinisialisasi akhir-akhir ini oleh kata kunci lateinit.


val dan var dalam fungsi dan kelas atau di konstruktor primer memiliki arti yang berbeda?

8

Pada dasarnya

  • var= variabel , jadi itu bisa berubah
  • val= value , jadi tidak bisa diubah.

8

Di Kotlin valadalah properti hanya-baca dan dapat diakses oleh pengambil saja. valtidak kekal.

val contoh:

val piNumber: Double = 3.1415926
    get() = field

Namun, varadalah properti baca-dan-tulis , sehingga dapat diakses tidak hanya oleh pengambil tetapi juga penyetel. varbisa berubah.

var contoh:

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

Jika Anda mencoba mengubah yang tidak dapat diubah val, IDE akan menampilkan kesalahan:

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

// RESULT:   Val cannot be reassigned 

Tetapi bisa berubah varbisa berubah:

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

// RESULT:   0.0

Semoga ini membantu.


4

properti val mirip dengan properti final di Jawa. Anda diizinkan untuk memberikan nilai hanya untuk satu kali. Saat Anda mencoba menetapkan ulang dengan nilai untuk kedua kalinya Anda akan mendapatkan kesalahan kompilasi. Sedangkan properti var bisa berubah yang Anda bebas untuk memindahkannya kapan saja dan kapan saja Anda inginkan.


4

Apakah Anda perlu mengubah variabel atau mengaturnya secara permanen?

  • Contoh yang bagus jika itu adalah sesuatu seperti val pi5places = 3.14159 Anda akan menetapkannya sebagai val. Apakah ada kemungkinan Anda perlu mengubah variabel itu sekarang atau nanti, maka Anda akan menetapkannya sebagai var.

  • Misalnya: Warna mobil, bisa jadi var colorCar = green. Nanti Anda bisa mengubahnya colorCar = blue, di mana sebagai val, Anda tidak bisa.

  • Tanggapan di sini tentang mutabledan immutablebaik-baik saja, tetapi mungkin menakutkan jika istilah-istilah ini tidak dikenal atau hanya mempelajari cara memprogram.


3

Nilai ke valvariabel hanya dapat ditetapkan satu kali.

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

Meskipun Anda tidak dapat menetapkan kembali nilai tetapi Anda tentu dapat memodifikasi properti objek.

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

Itu berarti Anda tidak dapat mengubah referensi objek yang ditunjuk oleh variabel tetapi properti yang mendasari variabel itu dapat diubah.

Nilai ke variabel var dapat ditetapkan ulang sebanyak yang Anda inginkan.

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

Jelas, properti yang mendasarinya dapat diubah selama mereka tidak dinyatakan val.

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


2

valseperti constantvariabel, itu sendiri tidak dapat diubah, hanya dapat dibaca, tetapi properti dari a valdapat dimodifikasi; varsama seperti variabel mutan dalam bahasa pemrograman lain.


2

val tidak dapat diubah, final, nilai yang diberikan pertama tidak dapat diubah.

val name:String = "andy"

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

var bisa berubah, dialihkan, Anda dapat mengubah nilai berulang-ulang.

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

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

Saya pikir cara termudah untuk mengingatnya:

val = variabel akhir

var = variabel dapat dipindahkan, atau kebalikan dari val.


Pertanyaannya adalah tentang perbedaan antara keduanya, bukan bagaimana membedakan bot. Silakan buka tautan di bawah ini yang akan membantu Anda memposting jawaban yang baik stackoverflow.com/help/how-to-answer
Prasoon Karunan V

Jadi Anda lebih suka jawaban yang sama, meskipun banyak orang telah menjawabnya. Dan bagi sebagian orang yang baru mengenal Kotlin, val dan var terdengar sama. Jadi, Anda perlu memberi mereka contoh bagaimana membedakannya dan apa mereka. Tapi ya, saya akan menerima saran Anda. Terima kasih.
Wahyu Anggara Raya

1

Keduanya, valdan vardapat digunakan untuk mendeklarasikan variabel (properti lokal dan kelas).

Variabel lokal :

  1. valmendeklarasikan variabel read-only yang hanya dapat ditugaskan satu kali, tetapi tidak dapat ditugaskan kembali .

Contoh:

val readonlyString = “hello”
readonlyString = “c u” // Not allowed for `val`
  1. varmendeklarasikan variabel yang dapat ditugaskan kembali seperti yang Anda ketahui dari Jawa (kata kunci akan diperkenalkan di Java 10, “inferensi tipe variabel lokal” ).

Contoh:

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

Itu selalu lebih baik untuk digunakan val. Cobalah untuk menghindari varsesering mungkin!

Properti kelas :

Kedua kata kunci juga digunakan untuk mendefinisikan properti di dalam kelas . Sebagai contoh, lihat yang berikut ini data class:

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

The Personberisi dua bidang, salah satunya adalah readonly ( name). Di agesisi lain, dapat dipindahkan setelah instantiasi kelas, melalui yang disediakan setter. Perhatikan bahwa nametidak akan memiliki metode penyetel yang sesuai.


1

Kedua variabel digunakan sebagai inisialisasi

  • val seperti variabel konstan, Dapat dibaca, dan properti val dapat dimodifikasi.

  • var seperti variabel yang bisa berubah. Anda dapat mengubah nilainya kapan saja.


1

Singkatnya, variabel val adalah final (tidak bisa berubah) atau nilai konstan yang tidak akan diubah di masa depan dan variabel var (bisa berubah) dapat diubah di masa depan.

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

Lihat kode di atas. Ini adalah kelas model, akan digunakan untuk mengirimkan data. Saya telah menetapkan val sebelum variabel karena variabel ini digunakan untuk mendapatkan data.

class DeliveryOrderEvent(var d : Delivery)

// setter and getter is fine here. No error

Juga, jika Anda perlu mengatur data nanti, Anda perlu menggunakan kata kunci var sebelum variabel, jika Anda hanya perlu mendapatkan nilai satu kali kemudian gunakan kata kunci val


1

Normal

  • Valmenggunakan untuk staticbidang seperti di Jawa sebagaiStatic Keyword

  • Seperti Staticdi Jawa / Sama seperti di kotlin

  • Dan Varmenunjukkan Variable Field di Kotlin itu, Anda bisa mengubahnya.

  • Sebagian besar Staticdigunakan ketika Anda ingin menyimpan nilai dalam memori statis sekaligus,

Contoh:

 if you assign

 val a=1
 a=3  You can not change it 
  • Anda tidak dapat berubah, ini adalah nilai akhir dan Statis

    var b=2

    b=4 Kamu bisa mengubahnya


1

val: harus menambah atau menginisialisasi nilai tetapi tidak bisa berubah. var: variabelnya dapat mengubah baris apa pun dalam kode.


1

Di kotlin kita dapat mendeklarasikan variabel dalam dua jenis: valdan var. valtidak dapat dipindahkan, ini berfungsi sebagai variabel akhir.

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

Di sisi lain, var dapat dipindahkan itu bisa berubah

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

0

Keduanya adalah variabel, satu-satunya perbedaan adalah variabel Mutable dan variabel immutable dan tidak ada perbedaan lagi. var adalah variabel Mutabel dan val tidak dapat diubah. Dalam Bahasa sederhana var dapat mengubah nilai setelah nilai inisialisasi val konstan dan tidak dapat mengubah nilainya setelah inisialisasi nilai.


0

val(dari nilai): Referensi tidak dapat diubah. Variabel yang dideklarasikan dengan valtidak dapat dipindahkan setelah diinisialisasi. Ini sesuai dengan finalvariabel di Jawa.

var(dari variabel): Referensi yang dapat diubah. Nilai variabel tersebut dapat diubah. Deklarasi ini sesuai dengan variabel Java reguler (non-final).


0

Var berarti Variabel -Jika Anda menyimpan objek apa pun menggunakan 'var' itu bisa berubah dalam waktu.

Sebagai contoh:

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

Val berarti nilai -Ini seperti 'konstan' di java. Jika Anda menyimpan objek apa pun menggunakan 'val' itu tidak bisa berubah dalam waktu.

Sebagai contoh:

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 digunakan untuk membuat variabel-variabel yang nilainya akan berubah dari waktu ke waktu dalam aplikasi Anda. Ini sama dengan VAR dari swift, sedangkan VAL digunakan untuk membuat variabel yang nilainya tidak akan berubah selama waktu dalam aplikasi Anda. Ini sama dengan LET of swift.


0

val - Immutable (setelah diinisialisasi tidak dapat dipindahkan)

var - Mutable (dapat mengubah nilai)

Contoh

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

Di Jawa - final n = 20; & int n = 20;


0

var adalah variabel yang dapat berubah dan dapat ditugaskan beberapa kali dan val adalah variabel yang tidak dapat diubah dan hanya dapat diinternalisasi satu kali.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.