You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实例化带主构造函数的Kotlin开放类DefaultBankAccount并正确初始化其属性

如何实例化带主构造函数的Kotlin开放类DefaultBankAccount并正确初始化其属性

嗨,我来帮你搞定这个问题~ 你遇到的核心问题其实很简单:你的DefaultBankAccount主构造函数里的参数只是构造函数的局部变量,并没有被定义成类的成员属性,所以实例化后这些值自然不会被留存下来。

咱们来拆解下原因:

  • 在Kotlin中,只有当你给构造函数参数加上var或val修饰符时,这个参数才会成为类的成员属性,否则它只是构造函数执行时的临时变量,执行完就消失了。
  • 你子类BrazilBankAccount看起来正常,是因为它是data类,主构造参数都加了val,这些参数会自动成为子类自己的属性,而父类只是接收了传递过来的值,但并没有把它们保存为自己的属性。

那解决方法也很直接,给DefaultBankAccount的主构造参数加上val(如果不需要修改就用val,需要修改就用var),把它们变成类的成员属性就行:

@Document(collection = "bankAccount")
open class DefaultBankAccount(
    val accountNumber: String,
    val address: String,
    val bankName: String,
    val codeIban: String,
    val codeSwift: String,
    val country: String,
    val holderName: String
) {
    companion object {
        @Transient
        val SEQUENCE_NAME = "payments_sequence"
    }

    @Id
    var id: Long = 0
    var createdAt: LocalDateTime = LocalDateTime.now()
    var updatedAt: LocalDateTime = LocalDateTime.now()
}

这样修改后,当你实例化DefaultBankAccount的时候,这些参数值就会被正确保存为类的属性,你就能正常访问它们了。

如果出于封装考虑,你不想让这些属性对外公开,可以把val改成private val,这样它们就变成类的私有成员,内部可以使用,外部如果需要访问的话,再手动添加公开的getter方法就行:

@Document(collection = "bankAccount")
open class DefaultBankAccount(
    private val accountNumber: String,
    private val address: String,
    private val bankName: String,
    private val codeIban: String,
    private val codeSwift: String,
    private val country: String,
    private val holderName: String
) {
    // 按需添加公开的getter
    fun getAccountNumber(): String = accountNumber
    fun getHolderName(): String = holderName

    companion object {
        @Transient
        val SEQUENCE_NAME = "payments_sequence"
    }

    @Id
    var id: Long = 0
    var createdAt: LocalDateTime = LocalDateTime.now()
    var updatedAt: LocalDateTime = LocalDateTime.now()
}

另外还要提一句,因为你用的是Spring Data MongoDB的@Document注解,修改后的属性会被自动映射到MongoDB文档的对应字段,完全不影响持久化功能哦。

备注:内容来源于stack exchange,提问作者Pelicer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 14:14:31