Kotlin 中的构造器

新手上路,请多包涵

I am learning Kotlin from official docs, I created one class like below where I created one constructor which has two parameters . constructor 的主体在 init 块中。

 class Person(name: String, surname: String) {
    init {
        Log.d("App", "Hello");
    }
}

好吧,我想再创建一个 constructor 这将在 parameter constructor 。在 Kotlin 中该怎么做

原文由 N Sharma 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 409
2 个回答

init 不是构造函数的主体。它在具有主构造函数上下文的主构造函数之后调用。

如官方文档中所述:

主构造函数不能包含任何代码。初始化代码可以放在初始化块中,这些块以 init 关键字为前缀:

 class Customer(name: String) {
    init {
        logger.info("Customer initialized with value ${name}")
    }
}

请注意,主构造函数的参数可以在初始化块中使用。它们也可以用在类主体中声明的属性初始值设定项中:

 class Customer(name: String) {
    val customerKey = name.toUpperCase()
}

事实上,对于声明属性并从主构造函数初始化它们,Kotlin 有一个简洁的语法:

 class Person(val firstName: String, val lastName: String, var age: Int) {
    // ...
}


根据您的问题,您可以添加一个构造函数来接受一个参数,如下所示:

 class Person(name: String, surname: String) {

    constructor(name: String) : this(name, "") {
        // constructor body
    }

    init {
        Log.d("App", "Hello");
    }
}

但它看起来不对,因为我们没有必要传递第二个参数空字符串。所以我们可以像下面这样命令构造函数:

 class Person(name: String) {

    constructor(name: String, surname: String) : this(name) {
        // constructor body
    }

    init {
        Log.d("App", "Hello");
    }
}

希望能帮助到你。

原文由 Sachin Chandil 发布,翻译遵循 CC BY-SA 3.0 许可协议

空值的第一种方法

// (name: String, surname: String)  default constructor signature
class Person(name: String, surname: String) {

    // init block , represents the body of default constructor
    init {
        Log.d("primary", "Hello");
    }

    // secondary constructor
    // this(name,"") call to default constructor
    constructor(name : String):this(name,""){
        Log.d("secondary", "Hello");
    }
}

为什么 this(name,"")

如果该类有一个主构造函数,则每个辅助构造函数都需要直接或通过另一个辅助构造函数间接委托给主构造函数。委托给同一类的另一个构造函数是使用 this 关键字完成的:

要么

kotlin won’t allow to use null like this(name,null) so use ? to represent null values with type, surname: String?

 class Person(name: String, surname: String?) {

    init {
        Log.d("primary", "Hello");
    }

    constructor(name : String):this(name,null){
        Log.d("secondary", "Hello");
    }
}

原文由 Pavneet_Singh 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题