Gần đây tôi đã đọc về const
từ 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 const
và val
từ 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?
Gần đây tôi đã đọc về const
từ 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 const
và val
từ 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:
const
s 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ư val
s, nơi nó có thể được thực hiện trong thời gian chạy.
Điều này có nghĩa là, const
khô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 String
hoặc nguyên thủy.
Ví dụ:
const val foo = complexFunctionCall() //Not okay
val fooVal = complexFunctionCall() //Okay
const val bar = "Hello world" //Also okay
const val foo = "Hello world"
và val bar = "Hello world"
? Họ có giống nhau không?
const
các giá trị sẽ hoàn toàn được nội tuyến trong quá trình biên dịch.
const val
thay vì chỉ const
? Dường như với tôi val
từ khóa là hoàn toàn thừa trong bối cảnh này, vì const var
nó sẽ vô lý trên khuôn mặt của nó.
const val
, const
là một sửa đổi trên val
chứ 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 fun
vv
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ấp cao nhất hoặc thành viên của một tuyên bố đối tượng hoặc một đối tượng đồng hành .
- Khởi tạo với giá trị kiểu String hoặc kiểu nguyên thủy
- Không có getter tùy chỉnh
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
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;
}
}
const
được loại bỏ, nó sẽ mang lại một tệp Java khác?
Cả hai val
và const
là 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
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
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 -
Trong kotlin, const
và val
cả hai đều đại diện cho tính bất biến và chỉ đọc các giá trị và đóng vai trò là final
từ 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