2017-08-03 108 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")