gpt4 book ai didi

firebase - Firestore 的 `documentSnapshot.toObject(className::class.java)` 如何重新分配在主构造函数中设置的 `val` 值?

转载 作者:行者123 更新时间:2023-12-02 13:36:21 26 4
gpt4 key购买 nike

我一直在开发 Kotlin 后端服务,偶然发现了 Firestore documentSnapshot.toObject(className::class.java)方法。

采取以下 Kotlin data class :

data class Record(
val firstName: String = "",
val lastName: String = "",
val city: String = "",
val country: String = "",
val email: String = "")

以下代码来自我的 Repository类(class):
if (documentSnapshot.exists()) {
return documentSnapshot.toObject(Record::class.java)!!
}

现在,据我了解方法 documentSnapshot.toObject(className::class.java)需要并调用无参数默认构造函数,例如 val record = Record() .

此调用将调用主构造函数并将其中规定的默认值(在数据类 Record 的情况下,空字符串 "" )分配给字段。

然后,它使用公共(public) setter 方法将实例的字段设置为 document 中的值。 .

鉴于这些字段已被标记为 val,这怎么可能?在主数据类构造函数中?
反射在这里起作用吗?
val在 Kotlin 中不是真正的决赛?

最佳答案

Firebase 确实使用反射来设置/获取值。具体来说,它使用 JavaBean 模式来识别属性,然后使用它们的 public 获取/设置它们。 getter/setter,或使用 public字段。

您的 data class被编译成这个 Java 代码的等价物:

public static final class Record {
@NotNull
private final String firstName;
@NotNull
private final String lastName;
@NotNull
private final String city;
@NotNull
private final String country;
@NotNull
private final String email;

@NotNull
public final String getFirstName() { return this.firstName; }
@NotNull
public final String getLastName() { return this.lastName; }
@NotNull
public final String getCity() { return this.city; }
@NotNull
public final String getCountry() { return this.country; }
@NotNull
public final String getEmail() { return this.email; }

public Record(@NotNull String firstName, @NotNull String lastName, @NotNull String city, @NotNull String country, @NotNull String email) {
Intrinsics.checkParameterIsNotNull(firstName, "firstName");
Intrinsics.checkParameterIsNotNull(lastName, "lastName");
Intrinsics.checkParameterIsNotNull(city, "city");
Intrinsics.checkParameterIsNotNull(country, "country");
Intrinsics.checkParameterIsNotNull(email, "email");
super();
this.firstName = firstName;
this.lastName = lastName;
this.city = city;
this.country = country;
this.email = email;
}

...

}

在这种情况下,当我需要将属性值写入数据库时​​,Firebase 使用公共(public) getter 来获取属性值,并在从数据库中读取属性值时使用字段来设置属性值。

关于firebase - Firestore 的 `documentSnapshot.toObject(className::class.java)` 如何重新分配在主构造函数中设置的 `val` 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56098742/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com