Sự khác biệt giữa những gì khác nhau


276

Gần đây tôi đã đọc về consttừ khóa, và tôi rất bối rối! Tôi không thể tìm thấy bất kỳ sự khác biệt giữa constvaltừ khóa, ý tôi là chúng ta có thể sử dụng cả hai từ khóa này để tạo một biến không thay đổi, còn thiếu gì nữa không?



Câu trả lời:


388

consts là hằng số thời gian biên dịch. Có nghĩa là giá trị của chúng phải được gán trong thời gian biên dịch, không giống như vals, nơi nó có thể được thực hiện trong thời gian chạy.

Điều này có nghĩa là, constkhông bao giờ có thể được gán cho một hàm hoặc bất kỳ hàm tạo nào, mà chỉ cho một Stringhoặc nguyên thủy.

Ví dụ:

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

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

3
Điều gì về một cái gì đó như thế này: const val foo = "Hello world"val bar = "Hello world"? Họ có giống nhau không?
Mathew Hany

5
@MathewHany, ít nhất là không về bytecode, xem: stackoverflow.com/questions/37482378/static-data-in-kotlin/...
hotkey

4
Tôi nghĩ rằng constcác giá trị sẽ hoàn toàn được nội tuyến trong quá trình biên dịch.
Luka Jacobowitz

102
Điều này đặt ra một câu hỏi khác: Tại sao Kotlin yêu cầu const valthay vì chỉ const? Dường như với tôi valtừ khóa là hoàn toàn thừa trong bối cảnh này, vì const varnó sẽ vô lý trên khuôn mặt của nó.
Eric Lloyd

18
@EricLloyd With const val, constlà một sửa đổi trên valchứ không phải là một từ khóa. Công cụ sửa đổi> từ khóa. Nhiều ví dụ về thiết kế này tương tự có, annotation/enum/data class, private val, inline funvv
Aro

38

Chỉ để thêm vào câu trả lời của Luka:

Hằng số thời gian biên dịch

Thuộc tính giá trị được biết tại thời gian biên dịch có thể được đánh dấu là hằng số thời gian biên dịch bằng cách sử dụng công cụ sửa đổi const. Các tính chất như vậy cần phải đáp ứng các yêu cầu sau:

Các tính chất như vậy có thể được sử dụng trong các chú thích.

Nguồn: Tài liệu chính thức


21

Bạn có thể chuyển đổi Kotlin thành Java. Sau đó, bạn có thể thấy const có một sửa đổi tĩnh nhiều hơn val . Các mã đơn giản như thế này.

Kotlin:

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

Đến Java (Phần):

@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
Ai đó có thể nêu trong một nhận xét tại sao câu trả lời này đã bị bỏ rơi vào quên lãng?
James Jordan Taylor

3
@JamesJordanTaylor Tôi đã nâng cấp. Nhưng tôi cho rằng đó là vì một số người đã không đọc nó một cách cẩn thận và trong nháy mắt câu trả lời này dường như đang nói về cách chuyển đổi từ java sang kotlin, điều này sẽ lạc đề.
dùng1032613

2
Điều gì nếu constđược loại bỏ, nó sẽ mang lại một tệp Java khác?
DYS

2
@DYS: Tôi nghĩ rằng nó sẽ loại bỏ "tĩnh" và nó sẽ chỉ là chuỗi cuối cùng công khai str = "hello";
Varun Ajay Gupta

5

Cả hai valconstlà bất biến.

constđược sử dụng để khai báo các hằng số thời gian biên dịch, trong khi valđối với các hằng số thời gian chạy.

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

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

4

const kotlin sang Java

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

val kotlin sang Java

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

Trong ngôn ngữ đơn giản

  1. Giá trị của biến const được biết tại thời điểm biên dịch.
  2. Giá trị của val được sử dụng để xác định các hằng số trong thời gian chạy.

Ví dụ 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"
}

Điều này là do getCar () được đánh giá trong thời gian chạy và gán giá trị cho Xe.

Ngoài ra -

  1. val là chỉ đọc có nghĩa là bất biến được biết đến vào thời gian chạy
  2. var có thể thay đổi được biết đến vào thời gian chạy
  3. const là bất biến và các biến được biết đến tại thời gian biên dịch

3

Trong kotlin, constvalcả hai đều đại diện cho tính bất biến và chỉ đọc các giá trị và đóng vai trò là finaltừ khóa trong java.

val từ khóa phải được sử dụng để khai báo cho các giá trị thời gian chạy và const từ khóa phải được sử dụng để khai báo các giá trị thời gian biên dịch.

Hãy nhớ rằng, const chỉ được sử dụng với các kiểu dữ liệu nguyên thủy không dành cho hàm và hàm tạo.

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.