「const」と「val」の違いは何ですか?


276

最近constキーワードについて読みましたが、とても混乱しています。私は何か違いを見つけることができませんconstし、val他の何かが、私が欠けていることがあり、私たちは不変の変数を作るためにそれらの両方を使用できることを意味し、キーワードを?



あなたはこの記事読むことができandroid4dev.com/difference-between-var-val-and-const-in-kotlin このビデオまたはウォッチyoutube.com/watch?v=DQLrEGqSSI8&t=6s
ロークシュデサイ

回答:


388

constsはコンパイル時の定数です。つまり、val実行時に実行できるs とは異なり、コンパイル時にそれらの値を割り当てる必要があります。

つまり、constsを関数やクラスコンストラクターに割り当てることはできず、Stringまたはプリミティブにのみ割り当てることができます。

例えば:

const val foo = complexFunctionCall()   //Not okay
val fooVal = complexFunctionCall()  //Okay

const val bar = "Hello world"           //Also okay

3
このようなものはどうですか:const val foo = "Hello world"そしてval bar = "Hello world"?彼らは同じですか?
Mathew Hany

5
@MathewHanyは、少なくともではないバイトコードの観点から、以下を参照してください。stackoverflow.com/questions/37482378/static-data-in-kotlin/...
ホットキー

4
const値はコンパイル中に完全にインライン化されると思います。
Luka Jacobowitz、

102
これは別の質問をします:なぜKotlin const valは単にではなく、なぜ必要とするのconstですか?valこの文脈では、キーワードはまったく必要ないように思えconst varます。
エリックロイド

18
@EricLloydではconst valconst上の修飾子であるvalのではなく、キーワード。修飾子>キーワード。これと同じデザインのほかの例であり、annotation/enum/data classprivate valinline fun、など
アロ

38

ルカの答えに追加するだけです:

コンパイル時定数

コンパイル時に値がわかっているプロパティは、const修飾子を使用してコンパイル時定数としてマークできます。このようなプロパティは、次の要件を満たす必要があります。

このようなプロパティは、アノテーションで使用できます。

出典:公式ドキュメント


21

KotlinをJavaに変換できます。次に、constにvalよりも静的修飾子が1つ多いことがわかります。このような単純なコード。

コトリン:

const val str = "hello"
class SimplePerson(val name: String, var age: Int)

Java(部分)へ:

@NotNull
public static final String str = "hello";

public final class SimplePerson {
   @NotNull
   private final String name;
   private int age;

   @NotNull
   public final String getName() {
      return this.name;
   }

   public final int getAge() {
      return this.age;
   }

   public final void setAge(int var1) {
      this.age = var1;
   }

   public SimplePerson(@NotNull String name, int age) {
      Intrinsics.checkParameterIsNotNull(name, "name");
      super();
      this.name = name;
      this.age = age;
   }
}

2
この回答が忘却に反対票を投じられた理由を誰かがコメントで述べることができますか?
ジェームズジョーダンテイラー

3
@JamesJordanTaylor私は賛成した。しかし、私はそれを一部の人々が注意深く読んでいないためだと思います、そして一見すると、この答えはjavaからkotlinに変換する方法について話しているようです。
user1032613

2
const削除した場合、別のJavaファイルが生成されますか?
DYS

2
@DYS:それは「静的」を削除し、それは単にpublic final String str = "hello"になると思います。
Varun Ajay Gupta

5

valconstはどちらも不変です。

constコンパイル時の定数を宣言するために使用されますがval、実行時定数のために使用されます。

const val VENDOR_NAME = "Kifayat Pashteen"  // Assignment done at compile-time

val PICon = getIP()  // Assignment done at run-time

4

const kotlinからJava

const val Car_1 = "BUGATTI" // final static String Car_1 = "BUGATTI";

val kotlinからJavaへ

val Car_1 = "BUGATTI"   // final String Car_1 = "BUGATTI";

簡単な言葉で

  1. const変数の値はコンパイル時にわかります。
  2. valの値は、実行時に定数を定義するために使用されます。

例1-

const val Car_1 = "BUGATTI"val Car_2 = getCar() ✔    
const val Car_3 = getCar()//Because the function will not get executed at the compile time so it will through error

fun getCar(): String {
    return "BUGATTI"
}

これは、getCar()が実行時に評価され、値をCarに割り当てるためです。

さらに-

  1. valは読み取り専用です。実行時に認識される不変を意味します
  2. varは実行時に認識される可変です
  3. constは不変であり、コンパイル時に既知の変数

3

kotlinではconstval両方が不変性を表し、値のみを読み取りfinal、Javaでキーワードとして機能します。

val実行時の値を宣言するにはconstキーワードを使用し、コンパイル時の値を宣言するにはキーワードを使用する必要があります。

constは、関数やコンストラクターではなく、プリミティブデータ型でのみ使用する必要があることに注意してください。

Example -

const val fun1 = anyFunctionOrConstructor() // it is not fine
    val fun2 = anyFunctionOrConstructor() // it is perfectly fine
    
    const val aa = "My String" // it is perfectly fine

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.