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 constvà valtừ 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ề 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 constvà valtừ 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:
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
const val foo = "Hello world"và val bar = "Hello world"? Họ có giống nhau không?
constcác giá trị sẽ hoàn toàn được nội tuyến trong quá trình biên dịch.
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ó.
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
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 valvà constlà 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, constvà valcả 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