Kotlin的私人建筑商

时间:2017-10-20 10:59:44

标签: java constructor kotlin visibility

在Java中,可以隐藏类的主要构造函数private,然后通过该类中的public static方法访问它:

public final class Foo {
    /* Public static method */
    public static final Foo constructorA() {
        // do stuff

        return new Foo(someData);
    }

    private final Data someData;

    /* Main constructor */
    private Foo(final Data someData) {
        Objects.requireNonNull(someData);

        this.someData = someData;
    }

    // ...
}

如何在不将类分成public接口和private实现的情况下与Kotlin达成同样的目标?使构造函数private导致它无法从类外部访问,甚至不能从同一文件中访问。

5 个答案:

答案 0 :(得分:39)

在使用私有构造函数时,您甚至可以执行更类似于“模拟”公共构造函数的使用。

class Foo private constructor(val someData: Data) {
    companion object {
        operator fun invoke(): Foo {
            // do stuff

            return Foo(someData)
        }
    }
}

//usage
Foo() //even though it looks like constructor, it is a function call

答案 1 :(得分:10)

使用伴侣对象可以做到这一点:

class Foo private constructor(val someData: Data) {
    companion object {
        fun constructorA(): Foo {
            // do stuff

            return Foo(someData)
        }
    }

    // ...
}

可以访问随播对象内的方法,就像它们是周围类的成员一样(例如Foo.constructorA()

答案 2 :(得分:4)

答案 3 :(得分:0)

我从事Java编程已有几年了,现在学习Kotlin作为一种新语言。 从我试图创建Singleton而不调用构造函数的过程中发现,是在类中将一个主构造函数声明为private声明,然后从这样的伴随对象调用函数(在我的情况下为Singleton)。

open class Singleton private constructor() {

fun produceSomeChicken(): String {
    return "CHICKEN"
}

companion object {
    private var INSTANCE : Singleton? = null
    fun getInstance(): Singleton {
        if (INSTANCE == null) {
            println("IS NULL")
            INSTANCE = Singleton()
            println("INSTANCE CREATED")
        }
        return INSTANCE as Singleton
    }

}}

然后从所需的任何地方调用该函数

println(Singleton.getInstance().produceSomeChicken()) //instance created without calling constructor
//println(Singleton().produceSomeChicken()) //is not possible to call, prevented by using private constructor (gives back compile error)

尽管问题很旧,但我仍然希望它能对您有所帮助!不客气

答案 4 :(得分:-1)

This is the Answer

class Hide private constructor(val someData: Data) {

}

By declaring the constructor private, we can hiding constructor.