Kotlin中的私有构造函数

103
在Java中,通过将一个类的主构造函数设为private,然后通过在该类内部使用一个publicstatic方法来访问它,可以隐藏该构造函数。
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;
    }

    // ...
}

如何使用Kotlin实现相同的功能,而无需将类分解为公共接口和私有实现? 将构造函数设置为private会导致它无法从类外部访问,甚至无法从同一文件中访问。

4个回答

177

即使在具有私有构造函数的情况下,您甚至可以执行更类似于“模拟”使用公共构造函数的操作。

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

29

使用伴生对象可以实现这一点:

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

            return Foo(someData)
        }
    }

    // ...
}

伴生对象中的方法可以像周围类的成员一样访问(例如Foo.constructorA())。


3
为了完整起见,从Java中只能使用Companion来调用伴生对象内的方法,例如Foo.Companion.constructorA()。为了使其在Java中更自然,可以使用@JvmStatic对该方法进行注释,然后该方法将表现得像静态方法(可以像调用Foo.constructorA()一样调用)。 - Pandemonium


-6
This is the Answer

class Hide private constructor(val someData: Data) {

}

By declaring the constructor private, we can hiding constructor.

虽然这段代码可能提供了问题的解决方案,但最好添加上为什么/如何运作的上下文。这可以帮助未来的用户学习,并将这些知识应用到他们自己的代码中。当代码被解释时,您还可能会得到用户的积极反馈,例如点赞。 - borchvm
你的回复没有回答问题,而且正确答案在两年前已经被多次给出了。 - Marvin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接