二级构造函数参数

时间:2019-01-08 01:14:33

标签: kotlin

有人可以帮我解决这个问题吗?我的对象有3个主要参数,均为Strings。现在,我想添加一个具有单个emum参数的辅助构造函数,该参数将依次设置3个原始参数,如下所示;

class MyObject(var string1: String, var string2: String, var string3: String)
{
    constructor(presetCode: PresetCode ) : this("", "", "")
    {
      when (presetCode)
      {
       PresetCode.Code1 ->
        {
         string1 = "aaa"
         string2 = "bbb"
         string3 = "ccc"
        }
       }
      }

   var anotherObject = AnotherObject(string1)

}

问题是AnotherObject(string1)不起作用,因为string1只是一个空字符串。

如何使用此辅助构造函数设置3个参数,然后成功调用AnotherObject(string1)? 谢谢

2 个答案:

答案 0 :(得分:2)

一个选择是用伴随对象上的invoke()方法替换辅助构造函数:

class MyObject(var string1: String, var string2: String, var string3: String) {
    companion object {
        operator fun invoke(presetCode: PresetCode) = when (presetCode) {
            PresetCode.Code1 -> MyObject("aaa", "bbb", "ccc")
            else -> MyObject("", "", "")
        }
    }

    var anotherObject = AnotherObject(string1)
}

在使用中,它看起来像一个构造函数调用,例如:

val o = MyObject(PresetCode.Code1)

此方法简单,简洁且非常灵活。 (例如,它可以返回一个缓存的实例,而不是创建一个新实例。)

答案 1 :(得分:1)

这是我根据您的类设计找到的解决方案,该解决方案需要每个AnotherObject实例进行一次MyObject构造:

class MyObject
{
    constructor(s1: String, s2: String, s3: String)
    {
        string1 = s1
        string2 = s2
        string3 = s3
        anotherObject = AnotherObject(string1)
    }

    constructor(presetCode: PresetCode)
    {
        when (presetCode)
        {
            PresetCode.Code1 ->
            {
                string1 = "aaa"
                string2 = "bbb"
                string3 = "ccc"
            }
            else ->
            {
                string1 = ""
                string2 = ""
                string3 = ""
            }
        }
        anotherObject = AnotherObject(string1)
    }

    var string1: String
    var string2: String
    var string3: String
    var anotherObject: AnotherObject
}

希望这会有所帮助。