【问题标题】:Kotlin - Init Block in Serializable Class can only read default property valuesKotlin - 可序列化类中的初始化块只能读取默认属性值
【发布时间】:2020-04-02 19:13:25
【问题描述】:

出于某种原因,每当我尝试在 init 块中访问这个可序列化类的属性时,只会打印默认值。我正在使用 firebase 将数据读入此类,该类按预期工作。我想根据场地名称参数更改类的布尔值,但不能因为只有默认场地名称被访问

class Venue(val venueName: String = "defaultName", val venueImageUrl: String = "", var venueImageName: String = "", val events: List<Event> = emptyList(), var isAd: Boolean = false, var isPromoVenue: Boolean = false

) : Serializable {
    val vName = venueName
    init {
        println(vName)
    }
}
#prints("defaultName") for each object created. 

【问题讨论】:

    标签: firebase class kotlin firebase-realtime-database serialization


    【解决方案1】:

    文档中的这句话

    Pass a custom Java object, if the class that defines it has a default constructor that takes no arguments and has public getters for the properties to be assigned.

    表示实例是使用默认构造函数通过反射创建的(在这种情况下相当于Venue()),然后将执行任何init 块。在构造实例之后,也通过反射设置字段(因为不需要设置器)。

    Serializable 在这里不应该相关(但它自己的机制根本不调用Venue 的构造函数,所以你甚至看不到defaultName 打印)。

    作为一种解决方法,您可以创建一个没有init 的帮助类

    class VenueDTO(val venueName: String = "defaultName", val venueImageUrl: String = "", val venueImageName: String = "", val events: List<Event> = emptyList(), val isAd: Boolean = false, val isPromoVenue: Boolean = false) : Serializable {
        val asVenue get() = Venue(this)
    }
    
    class Venue(val asDto: VenueDTO) {
        val vName = venueName
        init {
            println(vName)
        }
    }
    

    VenueDTO 存储在 Firebase 中,并在检索到时立即将其转换为 Venue

    【讨论】:

    • 非常感谢!只是想知道是否有覆盖读取对象方法?
    • "是否有覆盖读取对象的方法" Serializable 使用的方法是的,但如上所述,Firebase 可能不会使用它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-21
    • 2020-02-12
    • 2011-03-25
    • 2019-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多