当前位置: 首页 > 知识库问答 >
问题:

Serializable类中的Kotlin - Init块只能读取默认属性值

阴禄
2023-03-14

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

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. 

共有1个答案

杜英叡
2023-03-14

这段引用自文档

如果定义自定义Java对象的类有一个不带参数的默认构造函数,并且有要分配的属性的公共getters,则传递该对象。

这意味着该实例是使用默认构造函数通过反射创建的(在本例中相当于vitene()),然后将执行任何init块。构造实例后,字段也由反射设置(因为不需要setter)。

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

作为一种变通方法,您可以创建一个没有< code>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)
    }
}

将< code>VenueDTO存储在Firebase中,并在检索时立即将其翻译为< code>Venue。

 类似资料:
  • 本文向大家介绍C#属性的默认值,包括了C#属性的默认值的使用技巧和注意事项,需要的朋友参考一下 示例 可以使用初始化程序(C#6)设置默认值 如果它是只读的,则可以返回如下值:            

  • 20.1 属性默认值 Spring Boot支持的一些库使用缓存来提高性能。例如,模板引擎会缓存已编译的模板,以避免重复解析模板文件。此外,Spring MVC可以在服务静态资源时将HTTP缓存的头部添加到响应中。 虽然缓存功能对生产环境非常有益,但在开发过程中可能会产生反作用,使您无法看到程序中刚刚做出的更改。由于这个原因,spring-boot-devtools默认会禁用那些缓存选项。 缓存选

  • 我正在尝试使用thymeleaf读取属性,但无法使其工作。我有以下属性类别: 我正在尝试使用 但是,没有显示任何内容。 编辑:如果我设置。属性,它起作用了。但是为什么thymeleaf不选择默认值??

  • 问题内容: 我不知道何时属性应该是私有的,是否应该使用属性。 我最近读到,setter和getters不是pythonic,我应该使用属性装饰器。没关系。 但是,如果我有属性,那一定不能从类外部设置,而是可以读取的(只读属性)。这个属性应该是私有的吗?我所说的私有是指下划线吗?如果是,那么不使用getter怎么读?我现在知道的唯一方法是写 这样我就可以读取属性,但是我无法设置它,所以很好。 但是我

  • 我正在尝试获取一些类属性的类型,以便强烈键入我的静态编程语言代码。在打字稿中,我们可以这样做(愚蠢的例子,但这是为了解释) 这样做的好处是,如果我需要更改“_prop”的类型,不需要重构整个代码,因为类型是通过< code>Test["_prop"]找到的。在科特林有办法做到这一点吗? 我在Kotlin中见过反射函数,但无法得到我想要的 科特林代码:

  • 我用iText java创建了一个pdf表单,其中包含一个无线电组(PDFFormField.CreateRadioButton)并选中了一个默认按钮(选中)。我打开pdf(新的pdf阅读器)并检查字段。radiobutton字段值为空。我用acrobat打开pdf,点击已经选中的radiobutton并保存pdf。当我重新打开pdf检查字段值时,radiobutton值现在出现了。当我创建原始P