Kotlinのvar
とval
の違いは何ですか?
私はこのリンクを通り抜けました:
https://kotlinlang.org/docs/reference/properties.html
このリンクで述べたように:
読み取り専用プロパティ宣言の完全な構文は、2つの点で変更可能なものと異なります。それは、varではなくvalで始まり、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
}
var
とval
の正確な違いは何ですか?
なぜ両方が必要なのでしょうか。
これは 重複していない of Kotlinの 変数、Javaとの違いです。 VAR対VAR? 私は一般的なことだけではなく、文書中の特定の例に関連する疑問について質問しています。
あなたのコードでは、result
は変化していません、そのvar
プロパティは変化しています。下記のコメントを参照してください。
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
は、Javaのfinal
修飾子と同じです。 final
変数に再度代入することはできませんが、そのプロパティを変更することはできます。
val
とvar
は両方とも変数を宣言するために使用されます。
var は general variableのようなもので、 kotlin では可変変数として知られており、複数回割り当てることができます。
val は Final 変数のようであり、 kotlin では不変であることが知られており、一度だけ初期化できます。
val
とvar
の詳細については、以下のリンクを参照してください。
編集 : " val は似ている 定数 "から " val は似ている Final "
varで定義された変数は変更可能(読み取りと書き込み)
valで定義された変数は不変です(読み取り専用)
KotlinはfindViewByIdを削除し、AndroidスタジオのsetOnClickListenerのコードを減らすことができます。完全な参照のために:Kotlin素晴らしい機能
可変変数の値はいつでも変更できますが、不変変数の値は変更できません。
どこでvarを使いどこでvalを使うべきですか?
値が頻繁に変化する場合は、varを使用してください。例えばAndroidデバイスの位置を取得しながら
var integerVariable : Int? = null
クラス全体で値に変化がない場合はvalを使用します。たとえば、テキストビューやボタンのテキストをプログラムで設定したいとします。
val stringVariables : String = "Button's Constant or final Text"
kotlinでは、valはimmutable
、varはmutable
です。
単純にValをJavaの最終変数のように考える
簡単に言えば、var(mutable)とval(Java(final modifier)のように不変の値)
var x:Int=3
x *= x
//gives compilation error (val cannot be re-assigned)
val y: Int = 6
y*=y
あなたは簡単にそれを考えることができます:
var
はセッターに使用されます(値は変更されます)。
val
はgetterに使用されます(読み取り専用、値は変更されません)。
Kotlinでは
val
は 読み取り専用 のプロパティで、ゲッターのみがアクセスできます。val
は不変です。
val
の例:val piNumber: Double = 3.1415926
get() = field
ただし、
var
は 読み書き可能 プロパティなので、ゲッターだけでなくセッターからもアクセスできます。var
は可変です。
var
の例:var gravity: Double = 9.8
get() = field
set(value) {
field = value
}
val
を変更しようとすると、IDEはエラーを表示します。fun main() {
piNumber = 3.14 // ERROR
println(piNumber)
}
// RESULT: Val cannot be reassigned
var
は変更することができます。fun main() {
gravity = 0.0
println(gravity)
}
// RESULT: 0.0
お役に立てれば。
+----------------+-----------------------------+---------------------------+
| | 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; |
+----------------+-----------------------------+---------------------------+
基本的に
var
= variable なので、変更することができますval
= value なので、変更することはできません。val propertyはJavaのfinalプロパティに似ています。一度だけ値を割り当てることができます。 2回目の値で再割り当てしようとすると、コンパイルエラーが発生します。 varプロパティは変更可能ですが、いつでも好きなときに自由に再割り当てできます。
val
を使用して変数を宣言すると、それは 読み取り専用 variableになります。その価値を変えることはできません。 final / Java のようなものです。それはimmutable
です。
しかしvar
を使って変数を宣言すると、それは read または write にできる変数になります。その価値を変えることができます。それは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
}
val
は、キーワードlateinit
によって最近初期化することはできませんが、非プリミティブvar
は、キーワードlateinit
によって最近初期化することができます。
変数を変更したり、恒久的に設定したりする必要がありますか?
それが val pi5places = 3.14159 のようなものである場合の良い例です - /あなたはそれをval
として設定するでしょう。その変数を今すぐまたは後で変更する必要がある可能性はありますか、それならあなたはそれをvarとして設定するでしょう。
例: 自動車の色は、var colorCar = green
です。後でcolorCar = blue
を変更できますが、val
としては変更できません。
mutable
とimmutable
に関するここでの回答は問題ありませんが、これらの用語があまりよく知られていない場合、または単にプログラミングの仕方を学んでいる場合は、恐ろしいかもしれません。
val
変数への値は一度だけ割り当てることができます。
val address = Address("Bangalore","India")
address = Address("Delhi","India") // Error, Reassigning is not possible with val
値を再割り当てすることはできませんが、オブジェクトのプロパティを確実に変更することはできます。
//Given that city and country are not val
address.setCity("Delhi")
address.setCountry("India")
つまり、変数が指しているオブジェクト参照を変更することはできませんが、その変数の基礎となるプロパティは変更できます。
var変数への値は何度でも再割り当てできます。
var address = Address("Bangalore","India")
address = Address("Delhi","India") // No Error , Reassigning possible.
明らかに、その基礎となるプロパティは、valと宣言されていない限り変更できます。
//Given that city and country are not val
address.setCity("Delhi")
address.setCountry("India")
つまり、 val variableは最終的なもの(変更不可)、または将来変更されない定数値、および var variable(変更可能)は将来変更される可能性があります。
class DeliveryOrderEvent(val d : Delivery)
// Only getter
上記のコードを見てください。これはモデルクラスです、データの受け渡しに使用されます。この変数はデータを取得するために使用されたため、変数の前に val を設定しました。
class DeliveryOrderEvent(var d : Delivery)
// setter and getter is fine here. No error
また、後でデータを設定する必要がある場合は、変数の前に var キーワードを使用する必要があります。値を1回だけ取得する必要がある場合は val keywordを使用します。
Var - 変数 - 変数に格納されているオブジェクトは、時間の経過とともに変化する可能性があります。
Val - Value - valに格納されているオブジェクトは、時間的に変動することはありません。一度割り当てられると、valは読み取り専用になります。これは、Javaプログラミング言語の定数のようになります。
例えば:
fun main(args:Array<String>){
var numberOfHoursPassed=3
print("Number of hours passed: $numberOfHoursPassed")
//After 10 hours
numberOfHoursPassed=13 //value of var can be changed
print("Number of hours passed: $numberOfHoursPassed")
}
出力:
Number of hours passed: 3
Number of hours passed: 13
valに値を再割り当てすると、コンパイルエラーが発生します。
エラー: - Valは再割り当てできません。
結論として、varはどのレベルでも変更できます。一度割り当てられたvalは変更できませんでしたが、そのプロパティは変更できました。
参照先: https://www.tutorialkart.com/kotlin/val-vs-var-in-kotlin/ /
val は不変で、最後です。最初に割り当てられた値は変更できません。
val name:String = "andy"
name = "thomas" //Error: Val cannot be reassigned
var は変更可能、再割り当て可能です。値は何度も変更できます。
val a:Int = 1
var b:Int = 1
println("${a + b}") // output 2
b = 4
println("${a + b}") // output 5
私はそれを覚えるための最も簡単な方法だと思います:
val =可変最終
var =変数再割り当て可能、またはvalの逆。
普通
Val
は、JavaのようにStatic Keyword
としてstatic
フィールドに使用しています
JavaのStatic
と同じ/ kotlinと同じ
そしてVar
はKotlinの変数フィールドを意味し、あなたはそれを変更することができます。
Static
は、一度に静的メモリに値を保存したいときに使われます。
例:
if you assign
val a=1
a=3 You can not change it
変更することはできません、これは最終的な値であり静的です
var b=2
b=4
Uはそれを変更できます
val
とvar
は両方とも、変数(ローカルおよびクラスプロパティ)の宣言に使用できます。
ローカル変数 :
val
は、1回しか割り当てられない 読み取り専用 変数を宣言しますが、再割り当てはできませんを宣言します。例:
val readonlyString = “hello”
readonlyString = “c u” // Not allowed for `val`
var
は、あなたがJavaから知っているようにreassignable変数を宣言します(キーワードはJava 10で導入されます、 “ローカル変数型推論” )。例:
var reasignableString = “hello”
reasignableString = “c u” // OK
常にval
を使用することをお勧めします。できるだけvar
を使用しないようにしてください。
クラスプロパティ :
両方のキーワードは、クラス内の プロパティを定義するためにも使用されます 。例として、次のdata class
を見てください。
data class Person (val name: String, var age: Int)
Person
には2つのフィールドがあり、そのうちの1つは読み取り専用です(name
)。一方、age
は、提供されたsetter
を介して、クラスのインスタンス化後に再割り当てすることができます。 name
には対応するセッターメソッドがありません。
val
はconstant
変数のように、それ自身は変更することはできず、読み取ることしかできませんが、val
のプロパティは変更することができます。 var
は他のプログラミング言語のミュータント変数と同じです。
両方の変数は初期化として使用されます
valは定数変数のように、読みやすく、valのプロパティを変更することができます。
varは可変変数と同じです。値はいつでも変更できます。
val: 値を追加または初期化する必要がありますが、変更することはできません。 var: その変数はコードのどの行でも変更できます。
val
とvar
は両方とも変数を宣言したいときに使われます。 val
とvar
の違いは
1.変数を不変ではなくval
として宣言すると、その値を変更することはできません(現在、Javaのようにfinal
)
例: -
val value=100
value=200 //compile time error
val
として宣言した場合例
val value=100 //you have to initialize it here only
しかしvar
の場合
例: -
var value:Int //you can initialize it anytime
value=100 //initialized here
例: -
var value=100
value= 200 //changed its value and code will compile happily
両方とも変数ですが、唯一の違いは、可変変数と不変変数であり、それ以上の違いはありません。 varは可変変数、valは不変です。簡単な言語では、varは初期化後の値を変更できますvalは定数であり、初期化後の値を変更することはできません。
Kotlinでは、 変数 を宣言するためにvar
を使います。 可変 です。 can change、 再割り当て 変数。例、
fun main(args : Array<String>){
var x = 10
println(x)
x = 100 // vars can reassign.
println(x)
}
定数 を宣言するためにvalを使います。それらは 不変 です。 変更不可 、 再割り当て vals。 val
は、Javaのfinal
変数に似たものです。例、
fun main(args : Array<String>){
val y = 10
println(y)
y = 100 // vals can't reassign (COMPILE ERROR!).
println(y)
}
このようにしてみましょう。
Val is a Immutable constant
val change="Unchange" println(change)
//It will throw error because val is constant variable
// change="Change"
// println(change)
Var is a Mutable constant
var name: String="Dummy"
println(name)
name="Funny"
println(name)
VARは、アプリケーション内で時間の経過とともに値が変化する変数を作成するために使用されます。それはSwiftのVARと同じですが、VALはあなたのアプリケーションで時間の経過と共に変化しないそれらの変数を作成するために使用されます。SwiftのLETと同じです。
varは可変変数であり、複数回割り当てることができ、valは不変変数であり、1回だけ初期化できます。
正確な答えは KotlinをJavaに逆コンパイルする から得られます。
あなたがコトリンでこれをするならば:
data class UsingVarAndNoInit(var name: String)
data class UsingValAndNoInit(val name: String)
UsingVarAndNoInit を取得します。
package classesiiiandiiiobjects.dataiiiclasses.p04variiiandiiival;
import kotlin.jvm.internal.Intrinsics;
import org.jetbrains.annotations.NotNull;
public final class UsingVarAndNoInit {
@NotNull private String name;
@NotNull
public final String getName() {
return this.name;
}
public final void setName(@NotNull String string) {
Intrinsics.checkParameterIsNotNull((Object) string, (String) "<set-?>");
this.name = string;
}
public UsingVarAndNoInit(@NotNull String name) {
Intrinsics.checkParameterIsNotNull((Object) name, (String) "name");
this.name = name;
}
@NotNull
public final String component1() {
return this.name;
}
@NotNull
public final UsingVarAndNoInit copy(@NotNull String name) {
Intrinsics.checkParameterIsNotNull((Object) name, (String) "name");
return new UsingVarAndNoInit(name);
}
@NotNull
public static /* bridge */ /* synthetic */ UsingVarAndNoInit copy$default(
UsingVarAndNoInit usingVarAndNoInit, String string, int n, Object object) {
if ((n & 1) != 0) {
string = usingVarAndNoInit.name;
}
return usingVarAndNoInit.copy(string);
}
public String toString() {
return "UsingVarAndNoInit(name=" + this.name + ")";
}
public int hashCode() {
String string = this.name;
return string != null ? string.hashCode() : 0;
}
public boolean equals(Object object) {
block3:
{
block2:
{
if (this == object) break block2;
if (!(object instanceof UsingVarAndNoInit)) break block3;
UsingVarAndNoInit usingVarAndNoInit = (UsingVarAndNoInit) object;
if (!Intrinsics.areEqual((Object) this.name, (Object) usingVarAndNoInit.name)) break block3;
}
return true;
}
return false;
}
}
また、 UsingValAndNoInit を取得します。
package classesiiiandiiiobjects.dataiiiclasses.p04variiiandiiival;
import kotlin.jvm.internal.Intrinsics;
import org.jetbrains.annotations.NotNull;
public final class UsingValAndNoInit {
@NotNull private final String name;
@NotNull
public final String getName() {
return this.name;
}
public UsingValAndNoInit(@NotNull String name) {
Intrinsics.checkParameterIsNotNull((Object) name, (String) "name");
this.name = name;
}
@NotNull
public final String component1() {
return this.name;
}
@NotNull
public final UsingValAndNoInit copy(@NotNull String name) {
Intrinsics.checkParameterIsNotNull((Object) name, (String) "name");
return new UsingValAndNoInit(name);
}
@NotNull
public static /* bridge */ /* synthetic */ UsingValAndNoInit copy$default(
UsingValAndNoInit usingValAndNoInit, String string, int n, Object object) {
if ((n & 1) != 0) {
string = usingValAndNoInit.name;
}
return usingValAndNoInit.copy(string);
}
public String toString() {
return "UsingValAndNoInit(name=" + this.name + ")";
}
public int hashCode() {
String string = this.name;
return string != null ? string.hashCode() : 0;
}
public boolean equals(Object object) {
block3:
{
block2:
{
if (this == object) break block2;
if (!(object instanceof UsingValAndNoInit)) break block3;
UsingValAndNoInit usingValAndNoInit = (UsingValAndNoInit) object;
if (!Intrinsics.areEqual((Object) this.name, (Object) usingValAndNoInit.name)) break block3;
}
return true;
}
return false;
}
}
ここにもっと例があります: https://github.com/tomasbjerre/yet-another-kotlin-vs-Java-comparison
val
(from value):不変の参照val
で宣言された変数は、初期化後に再割り当てすることはできません。これはJavaのfinal
変数に対応します。
var
(from from variable):可変参照そのような変数の値は変更することができます。この宣言は通常の(最後ではない)Java変数に対応します。
Valは不変で、そのプロパティはrun timeに設定されますが、const修飾子を使用して、時定数をコンパイルします。 kotlinのValはJavaのfinalと同じです。
Varは可変であり、そのタイプはcompile timeで識別されます。
val - 不変(一度初期化されたものは再割り当てできません)
var - 可変(値を変更できる)
例
コトリンで - val n = 20&var n = 20
Javaの場合 - final int n = 20。 &int n = 20;
Var の意味 変数 - 'var'を使用してオブジェクトを保存した場合 時間の経過とともに変化する可能性があります。
例えば:
fun main(args: Array<String>) {
var a=12
var b=13
var c=12
a=c+b **//new object 25**
print(a)
}
Val は 値 - Javaの '定数' のようなものです。 'val'を使用してオブジェクトを格納した場合は、時間内に変更できませんでした。
例えば:
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)
}