如何初始化构造函数外部的字段

时间:2019-10-29 06:30:14

标签: android class kotlin constructor

我有一个用于Room的数据类。在课程的开头,有日期字段,格式为字符串_dateControl和_timeCreate。类的主体中有long类型的dateControl和timeCreate字段。通过翻新请求数据时,将分别初始化dateControl和timeCreate字段。但是,如果我尝试声明一个类的实例,则这些字段(dateControl和timeCreate)不会初始化,并且等于0。

班级

@Entity
class DetailNum(
    @SerializedName("id_ndt_res")
    @PrimaryKey val id: Int,
    @SerializedName("id_pr")
    val idEntUser: Int,
    @SerializedName("id_parts")
    val type: Int,
    @SerializedName("dt_controlya")
    var _dateControl: String,
    @SerializedName("number_part")
    var numDetail: String?,
    @SerializedName("god_izg")
    var yearCreate: Int,
    @SerializedName("id_zavods")
    var idFactory: Int,
    @SerializedName("time_create")
    var _timeCreate: String,
    @SerializedName("id_result")
    var resultControl: Int,
    @SerializedName("familiya_i_o_speca")
    var fioSpec: String?,
    @SerializedName("is_new_part")
    var isNew: Int,
    @SerializedName("is_from_pto")
    var isFromPto: Int,
    @SerializedName("is_not_kriterii_01_08_2013")
    var isNotKrit01082013: Int,
    @SerializedName("isLoaded")
    var isLoaded: Int = 0

) {
    public fun getSimpleDateStr() = SimpleDateFormat("dd.MM.yyyy").format(Date(dateControl))

    val strResultControl: String
        get() = resultControl.toString()

    var dateControl: Long = 0
        set(value) {
            val date = SimpleDateFormat("dd.MM.yyyy").parse(_dateControl)
            field = date.time
        }

    var timeCreate: Long = 0
        set(value) {
            val date = SimpleDateFormat("dd.MM.yyyy HH:mm:ss").parse(_timeCreate)
            field = date.time
        }
    var nameResult:String?=""

    fun getFirstCharNameResult() = if(!nameResult.isNullOrEmpty()) nameResult?.get(0)?.toUpperCase() else ""
}

尝试这样的初始化

var detailNum = DetailNum(0, 0, 0, DateUtils.getSimpleDateStr(Date()), "", 0, 0, DateUtils.getSimpleDateStr(Date()), 0,"", 0, 0, 0 )

为什么在第二种情况下未初始化长日期字段,以及如何初始化它们?我是科特林的新人,请先解释一下,谢谢

2 个答案:

答案 0 :(得分:0)

对类似下面的变量使用lateinit

lateinit var subject: TestSubject

答案 1 :(得分:0)

您的字段dateControltimeCreate未在构造函数中初始化!如果不是某些框架,则不会自动调用他们的setter。

如果希望在构造函数初始化后立即设置它们,则可以:

1)..立即设置默认值

val dateControl: Long = SimpleDateFormat("dd.MM.yyyy").parse(_dateControl).time

2)..或如果操作需要更多代码,或者您想将内部字段初始化集合在一起,则使用init

class DetailNum(...) {

   var dateControl: Long = 0

   init {
      dateControl = SimpleDateFormat("dd.MM.yyyy").parse(_dateControl).time
      ...
   }

}

有关构造函数和init的更多信息,您可以找到here

顺便说一句:您的设置者根本不使用提供的值,因此实际上它们是无用的。