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.

Akshar Patel
sumber
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.

chandil03
sumber
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/

Patel Pinkal
sumber
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"
user6435056
sumber
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


sumber
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
huseyin
sumber
12

val adalah immutabledan var mutabledi Kotlin.

Samir Mangroliya
sumber
12

Cukup pikirkan Val seperti Variabel akhir di java

Menghubungkan kehidupan dengan Android
sumber
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

Joby Wilson Mathews
sumber
8

Anda dapat dengan mudah menganggapnya sebagai:

var digunakan untuk setter (nilai akan berubah).

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

Ling Boo
sumber
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.

Avijit Karmakar
sumber
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.
Bharat Sonawane
sumber
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.

Andy
sumber
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.

Halil RAŞO
sumber
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.

Teckeon
sumber
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")
Saurabh Padwekar
sumber
3

Dua cara untuk membuat variabel dalam KOTLIN VAL dan VAR

1. VAL menyimpan nilai konstan. Juga disebut Final Variable

2. VAR menyimpan Nilai yang Dapat Diganti

Klik di sini misalnya

Coltin Casmir
sumber
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.

suyanlu
sumber
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.

Wahyu Anggara Raya
sumber
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.

s1m0nw1
sumber
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.

Nikhil Katekhaye
sumber
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

Shaon
sumber
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

Zafar Husain
sumber
1

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

Mohamed Ibrahim
sumber
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
Marium Jawed
sumber
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.

Nick
sumber
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).

Gulzar Bhat
sumber
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)
}
NHB SOHEL
sumber
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.

Ashutosh Shukla
sumber
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;

Najib Ahmed Puthawala
sumber
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.

Yohan Malshika
sumber