Kotlin的私人建筑商

Mar*_*ler 35 java constructor visibility kotlin

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

    // ...
}
Run Code Online (Sandbox Code Playgroud)

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

小智 53

在使用私有构造函数时,您甚至可以执行更类似于"模拟"公共构造函数的使用的操作.

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
Run Code Online (Sandbox Code Playgroud)


Mar*_*ler 14

这可以使用伴侣对象:

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

            return Foo(someData)
        }
    }

    // ...
}
Run Code Online (Sandbox Code Playgroud)

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

  • 添加到此是为了完整性。在 Java 中,您只能使用“Companion”(如“Foo.Companion.constructorA()”)调用伴生对象内部的方法。为了使其在 Java 中更自然,请使用“@JvmStatic”注释该方法,该方法将像静态方法一样运行(如“Foo.constructorA()”那样调用)。 (3认同)