当前位置: 首页 > 知识库问答 >
问题:

科特林二级建造师

蓬琦
2023-03-14

如何在静态编程语言中声明辅助构造函数?

有相关文件吗?

以下内容不编译...

class C(a : Int) {
  // Secondary constructor
  this(s : String) : this(s.length) { ... }
}

共有3个答案

任云瀚
2023-03-14

声明二级构造函数静态编程语言只需使用构造函数关键字

这是一个主构造函数:

class Person constructor(firstName: String) {

}

class Person(firstName: String) {

}

对于这样的二级构造函数代码:

class Person(val name: String) {
    constructor(name: String, parent: Person) : this(name) {
        parent.children.add(this)
    }
}

必须调用主构造函数,否则编译器将抛出以下错误

Primary constructor call expected
柴昆杰
2023-03-14

正如文档所指出的,您可以通过这种方式使用二级构造函数

class GoogleMapsRestApiClient constructor(val baseUrl: String) {

    constructor() : this("https://api.whatever.com/")

}

请记住,必须扩展第一个构造函数行为。

严亦
2023-03-14

更新:由于M11 (0.11.*)静态编程语言支持二级构造函数。

目前,Kotlin只支持主构造函数(稍后可能会支持辅助构造函数)。

二级构造函数的大多数用例都是通过以下技术之一解决的:

技巧1。(解决您的问题)在类旁边定义工厂方法

fun C(s: String) = C(s.length)
class C(a: Int) { ... }

用法:

val c1 = C(1) // constructor
val c2 = C("str") // factory method

技巧2。(也可能有用)定义参数的默认值

class C(name: String? = null) {...}

用法:

val c1 = C("foo") // parameter passed explicitly
val c2 = C() // default value used

请注意,默认值适用于任何函数,而不仅仅适用于构造函数

技巧3。(当您需要封装时)使用在伴随对象中定义的工厂方法

有时,您希望构造函数是私有的,并且只有一个工厂方法可供客户端使用。目前,这只适用于在伴生对象中定义的工厂方法:

class C private (s: Int) {
    companion object {
        fun new(s: String) = C(s.length)
    }
}

用法:

val c = C.new("foo")
 类似资料:
  • 我是科特林的新手。我想问Kotlin的私人建造者是干什么的?。我的意思是,如果我们不能创建它的实例,应该是什么类呢?

  • 如何在使用Kotlin的Spring Boot中正确初始化ConfigurationProperties? 目前我喜欢下面的例子: 但是它看起来很丑陋,实际上不是一个iable,foo是常量ue,应该在启动期间初始化,将来不会改变。

  • 问题内容: 我正在学习具有C ++和Java背景的Kotlin。我期待下面的打印,不。我知道这对应到。默认实现不比较每个成员,即和吗?如果是这样,它会不会看到字符串值相等(因为再次映射到字符串值)?显然,我在Kotlin中还没有涉及平等与身份相关的问题。 问题答案: 您描述的默认实现仅适用于数据类。不适用于从中继承实现的常规类,只需使对象与自身相等即可。

  • 这是正确的吗? 我可以找到一个相关的问题,但它是有参数的,我不能在没有params的情况下转换它。

  • 我正在尝试IntDef typedef将特定类型的参数限制为函数。但是当我使用Java使用IntDef时,它工作正常,但同时,它不适用于kotlin。以下是我的代码片段 - 在JAVA中- 在静态编程语言中- 在课堂上使用- 调用演示函数给我一个错误消息,说它必须是:< code>TransTypeJava之一。CASH,< code>TransTypeJava。通过传递< code>TransT