2017-08-03 27 views
5

Kotlin'de, özel bir kurucuya sahip bir sınıfın örneğini oluşturan fabrika işlevine sahip olmak mümkün mü?Kotlin - Özel Yapıcı ile Sınıf için Fabrika Fonksiyonu

Amacım, kullanılacak fabrika işlevini zorlamak ve sınıf kurucusu aracılığıyla örneklemeyi önlemek.

Örnek:

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

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

ben yerleşik fabrika fonksiyonları intArrayOf() gibi mesela bazı davranışlarını taklit çalışıyorum

import MyClass.Companion.myClassOf 

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

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

cevap

4

Böyle bir şey yapabiliriz. Örneğin:

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

val myInstance = MyClass.of("first", "second") 
+2

Haklısınız, MyClass.myClassOf() demek? –

+0

Companion nesnesini içe aktarırsanız gerek duymazsınız: 'MyClass.Companion.myClassOf' - Daha net olması için cevabı güncelleştiririm –

+0

@JKLy bu yüzden Companion nesnesini veya sınıfı referans olarak almak zorundayım işlevi. IntArrayOf() 'a özel muamele verildiğini ve kendi fabrika fonksiyonum için tekrarlanamayacağını tahmin etmek? İdeal olarak, sınıfın paketini sadece sınıfın kendisinin ithal edebilmek istiyorum. – Pooch

6

Bu şekilde her companion object kullanabilirsiniz::

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

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

Adı özel bir anlamı vardır eğer fabrika işlevi

// works 
val myIntArray = intArrayOf() 

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