2017-08-03 381 views
5

在Kotlin中,是否有可能使用私有构造函数创建类的实例的工厂函数?Kotlin - 具有私有构造函数的工厂函数

我的目标是强制使用工厂函数并防止通过类的构造函数实例化。

例子:

// factory function, valid 
val myInstance = myClassOf() 

// class instantiation, invalid 
val myInstance = MyClass() 

我试图模仿的一些内置的工厂功能,如intArrayOf(),例如行为

// works 
val myIntArray = intArrayOf() 

// not possible as IntArray has a private constructor 
val myIntArray = IntArray() 

回答

4

你可以做这样的事情:

import MyClass.Companion.myClassOf 

class MyClass private constructor() { 
    companion object { 
     fun myClassOf() = MyClass() 
    } 
} 

//val myInstance1 = MyClass() // not allowed 
val myInstance2 = myClassOf() 
+2

你的意思是MyClass.myClassOf(),对不对? –

+0

如果您导入伴随对象,则不需要:'MyClass.Companion.myClassOf' - 我将更新答案以更清晰 –

+0

@JKLy,因此我需要导入Companion对象或类以引用此对象功能。猜测'intArrayOf()'被给予特殊处理,并且不能为我自己的工厂函数复制?理想情况下,我希望能够导入课程包而不是课程本身。 – Pooch

6

可以以这种方式使用companion object

class MyClass private constructor() { 
    companion object { 
    operator fun invoke() = MyClass() 
    } 
} 

val myInstance = MyClass() // Calls the factory function invoke() 

名称,如果它具有特殊的含义出厂功能。例如:

class MyClass private constructor(values: List<String>) { 
    companion object { 
    fun of(vararg values: String) = MyClass(values.toList()) 
    } 
} 

val myInstance = MyClass.of("first", "second") 
相关问题