2017-08-03 11 views
5

Kotlinでは、プライベートコンストラクタを使用してクラスのインスタンスを作成するファクトリ関数を使用できますか?Kotlin - プライベートコンストラクタを持つクラスのファクトリ関数

私の目標は、使用するファクトリ関数を強制し、クラスのコンストラクタによるインスタンス化を防ぐことです。

例:

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

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

私は、例えば、intArrayOf()のような組み込みの工場機能のいくつかの動作を模倣しようとしています

import MyClass.Companion.myClassOf 

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

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

答えて

4

あなたはこのような何かを行うことができます。例:

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

val myInstance = MyClass.of("first", "second") 
+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() 

名前、それは特別な意味を持っている場合は、工場機能

// works 
val myIntArray = intArrayOf() 

// not possible as IntArray has a private constructor 
val myIntArray = IntArray() 
関連する問題