Kotlin 中的私有构造函数

Private constructor in Kotlin

在 Java 中,可以隐藏 class' 主构造函数,方法是使它成为 private,然后通过内部的 public static 方法访问它class:

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;
    }

    // ...
}

如果不将 class 分为 public 接口和 private 实现,Kotlin 如何能达到同样的效果?创建构造函数 private 会导致无法从 class 外部访问它,甚至无法从同一文件访问它。

这可以使用伴随对象:

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

            return Foo(someData)
        }
    }

    // ...
}

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

您甚至可以在拥有私有构造函数的同时做一些更类似于 "emulating" 使用 public 构造函数的事情。

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

在此处查看 kotlin 文档:

https://kotlinlang.org/docs/reference/classes.html#constructors

https://kotlinlang.org/docs/reference/visibility-modifiers.html#constructors

class DontCreateMe private constructor () { /*...*/ }
This is the Answer

class Hide private constructor(val someData: Data) {

}

By declaring the constructor private, we can hiding constructor.