2017-08-03 20 views
5

Czy w Kotlinie istnieje funkcja fabryczna, która tworzy egzemplarz klasy z prywatnym konstruktorem?Kotlin - Funkcja fabryczna dla klasy z prywatnym konstruktorem

Moim celem jest wymuszenie użycia funkcji fabrycznej i zapobieganie powstawaniu instancji za pomocą konstruktora klasy.

Przykład:

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

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

Próbuję naśladować zachowanie niektórych wbudowanych funkcji fabrycznych jak intArrayOf(), np

// works 
val myIntArray = intArrayOf() 

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

Odpowiedz

4

można zrobić coś takiego:

import MyClass.Companion.myClassOf 

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

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

Masz na myśli MyClass.myClassOf(), prawda? –

+0

Nie musisz, jeśli zaimportujesz obiekt towarzyszący: 'MyClass.Companion.myClassOf' - Zaktualizuję odpowiedź, aby była jaśniejsza –

+0

@JKLy, więc będę musiał zaimportować obiekt Companion lub klasę, aby odwołać się do tego funkcjonować. Zgadywanie, że 'intArrayOf()' jest traktowany w specjalny sposób i nie można go replikować dla mojej własnej funkcji fabrycznej? Idealnie chciałbym móc po prostu zaimportować pakiet klasy, a nie samą klasę. – Pooch

6

Można użyć companion object w ten sposób:

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

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

nazwą funkcji fabrycznych jeśli to ma szczególne znaczenie. Na przykład:

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

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