Có một số cách bạn có thể định nghĩa các hằng số trong Kotlin,
Sử dụng đối tượng đồng hành
companion object {
const val ITEM1 = "item1"
const val ITEM2 = "item2"
}
bạn có thể sử dụng khối đối tượng đồng hành ở trên bên trong bất kỳ lớp nào và xác định tất cả các trường của bạn bên trong khối này. Nhưng có một vấn đề với cách tiếp cận này, tài liệu nói,
mặc dù các thành viên của các đối tượng đồng hành trông giống như các thành viên tĩnh trong các ngôn ngữ khác, trong thời gian chạy, chúng vẫn là các thành viên thể hiện của các đối tượng thực và, ví dụ, có thể thực hiện các giao diện.
Khi bạn tạo các hằng số của mình bằng cách sử dụng đối tượng đồng hành và xem mã byte được dịch ngược , bạn sẽ có một cái gì đó như bên dưới,
ClassName.Companion Companion = ClassName.Companion.$$INSTANCE;
@NotNull
String ITEM1 = "item1";
@NotNull
String ITEM2 = "item2";
public static final class Companion {
@NotNull
private static final String ITEM1 = "item1";
@NotNull
public static final String ITEM2 = "item2";
// $FF: synthetic field
static final ClassName.Companion $$INSTANCE;
private Companion() {
}
static {
ClassName.Companion var0 = new ClassName.Companion();
$$INSTANCE = var0;
}
}
Từ đây, bạn có thể dễ dàng thấy những gì tài liệu nói, mặc dù các thành viên của các đối tượng đồng hành trông giống như các thành viên tĩnh trong các ngôn ngữ khác, trong thời gian chạy, chúng vẫn là các thành viên thể hiện của các đối tượng thực. Nó làm việc thêm so với yêu cầu.
Bây giờ đến một cách khác, nơi chúng ta không cần sử dụng đối tượng đồng hành như bên dưới,
object ApiConstants {
val ITEM1: String = "item1"
}
Một lần nữa nếu bạn thấy phiên bản dịch ngược của mã byte của đoạn mã trên, bạn sẽ tìm thấy một cái gì đó như thế này,
public final class ApiConstants {
private static final String ITEM1 = "item1";
public static final ApiConstants INSTANCE;
public final String getITEM1() {
return ITEM1;
}
private ApiConstants() {
}
static {
ApiConstants var0 = new ApiConstants();
INSTANCE = var0;
CONNECT_TIMEOUT = "item1";
}
}
Bây giờ nếu bạn thấy mã dịch ngược ở trên, nó sẽ tạo phương thức get cho mỗi biến. Phương pháp get này là không cần thiết ở tất cả.
Để thoát khỏi các phương thức get này , bạn nên sử dụng const trước val như bên dưới,
object ApiConstants {
const val ITEM1: String = "item1"
}
Bây giờ nếu bạn thấy mã được dịch ngược của đoạn trích trên, bạn sẽ thấy dễ đọc hơn vì nó thực hiện chuyển đổi nền ít nhất cho mã của bạn.
public final class ApiConstants {
public static final String ITEM1 = "item1";
public static final ApiConstants INSTANCE;
private ApiConstants() {
}
static {
ApiConstants var0 = new ApiConstants();
INSTANCE = var0;
}
}
Vì vậy, đây là cách tốt nhất để tạo hằng.
public static final
trường trong Java, hãy sử dụngconst val
trong đối tượng đồng hành của bạn. Nếu bạn muốn mộtprivate static final
trường và một getter công khai, hãy sử dụngval
trong đối tượng đồng hành của bạn.