如何实例化带主构造函数的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
相关产品推荐
相关产品推荐

