Sử dụng Android Studio và plugin Kotlin , tôi đã tìm thấy một cách dễ dàng để chuyển đổi các Java cũ Parcelablecủa mình mà không cần bổ sung thêm plugin (nếu tất cả những gì bạn muốn là biến một datalớp hoàn toàn mới thànhParcelable , hãy chuyển đến đoạn mã thứ 4).
Giả sử bạn có một Personlớp với tất cả các Parcelabletấm lò hơi:
public class Person implements Parcelable{
public static final Creator<Person> CREATOR = new Creator<Person>() {
@Override
public Person createFromParcel(Parcel in) {
return new Person(in);
}
@Override
public Person[] newArray(int size) {
return new Person[size];
}
};
private final String firstName;
private final String lastName;
private final int age;
public Person(String firstName, String lastName, int age) {
this.firstName = firstName;
this.lastName = lastName;
this.age = age;
}
protected Person(Parcel in) {
firstName = in.readString();
lastName = in.readString();
age = in.readInt();
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(firstName);
dest.writeString(lastName);
dest.writeInt(age);
}
@Override
public int describeContents() {
return 0;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
public int getAge() {
return age;
}
}
Bắt đầu bằng cách loại bỏ việc Parcelabletriển khai, để lại một đối tượng Java cũ, đơn giản, (các thuộc tính phải là cuối cùng và được thiết lập bởi hàm tạo):
public class Person {
private final String firstName;
private final String lastName;
private final int age;
public Person(String firstName, String lastName, int age) {
this.firstName = firstName;
this.lastName = lastName;
this.age = age;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
public int getAge() {
return age;
}
}
Sau đó, hãy để Code > Convert Java file to Kotlin Filetùy chọn làm điều kỳ diệu của nó:
class Person(val firstName: String, val lastName: String, val age: Int)
Chuyển đổi này thành một datalớp:
data class Person(val firstName: String, val lastName: String, val age: Int)
Và cuối cùng, hãy biến điều này thành một Parcelablelần nữa. Di chuột qua tên lớp và Android Studio sẽ cung cấp cho bạn tùy chọn Add Parcelable Implementation. Kết quả sẽ như thế này:
data class Person(val firstName: String, val lastName: String, val age: Int) : Parcelable {
constructor(parcel: Parcel) : this(
parcel.readString(),
parcel.readString(),
parcel.readInt()
)
override fun writeToParcel(parcel: Parcel, flags: Int) {
parcel.writeString(firstName)
parcel.writeString(lastName)
parcel.writeInt(age)
}
override fun describeContents(): Int {
return 0
}
companion object CREATOR : Parcelable.Creator<Person> {
override fun createFromParcel(parcel: Parcel): Person {
return Person(parcel)
}
override fun newArray(size: Int): Array<Person?> {
return arrayOfNulls(size)
}
}
}
Như bạn có thể thấy, việc Parcelabletriển khai là một số mã được tạo tự động được thêm vào datađịnh nghĩa lớp của bạn .
Ghi chú:
- Việc cố gắng chuyển đổi Java
Parcelable trực tiếp thành Kotlin sẽ không tạo ra kết quả tương tự với phiên bản hiện tại của plugin Kotlin ( 1.1.3).
- Tôi đã phải loại bỏ một số dấu ngoặc nhọn bổ sung mà
Parcelabletrình tạo mã hiện tại giới thiệu. Phải là một lỗi nhỏ.
Tôi hy vọng mẹo này hiệu quả với bạn cũng như nó đã làm cho tôi.