什么是在Kotlin建造一个class级的正确方法

我有一个有很多非空字段的类,可以是空字段。 如果我宣布他们喜欢

val key : String 

Kotlin编译器当然会给我一个错误,告诉我它们需要被初始化,所以我想我应该把不可空的部分放在构造函数中,当我需要用非空值初始化的可空字段时添加一个辅助构造函数。 这是为了避免调用一个构造函数,然后调用者,我会然后调用一个构造函数。 这是它出来的样子

 import utilities.Constants import java.util.* class Action(val key: String, //val actionNode: ActionNode val date: Date, val stringValue: String, val autoRecognitionStatus: Constants.MeasurementAutoRecognized, val recognitionId: String, val method: Constants.MeasurementMethod, val userKey: String, val userName: String, val isInRange: Boolean) { var pictureUrl: String? = null var remotePictureUrl: String? = null constructor(key: String, // actionNode: ActionNode date: Date, stringValue: String, autoRecognitionStatus: Constants.MeasurementAutoRecognized, recognitionId: String, method: Constants.MeasurementMethod, userKey: String, userName: String, isInRange: Boolean, pictureUrl: String?, remotePictureUrl: String?) : this(key, // actionNode date, stringValue, autoRecognitionStatus, recognitionId, method, userKey, userName, isInRange) { this.pictureUrl = pictureUrl this.remotePictureUrl = remotePictureUrl } } 

我的问题是,这个代码看起来很可怕。 我并不是说外表最重要,但我觉得这是一个错误的做法。 尤其是当我需要委托给主构造函数时,我不得不重写大量的参数

有没有更好的或“正确”的方法来做到这一点?

编辑:我在问:我用Kotlin编写了很多可以更容易完成的代码吗?

如果这个类是这样完成的,那么你也可以把它作为一个数据类 。 另外Kotlin支持属性的默认值,所以你只需要一个构造函数,即主构造函数。 下面的类看起来更好,几乎和你所定义的一样。

 data class Action( val key: String, val date: Date, val stringValue: String, val autoRecognitionStatus: MeasurementAutoRecognized, val recognitionId: String, val method: MeasurementMethod, val userKey: String, val userName: String, val isInRange: Boolean, var pictureUrl: String? = null, var remotePictureUrl: String? = null ) 

如果您需要Java的二级构造函数,则可以使用@JvmOverloads对给定的构造函数进行@JvmOverloads