Kotlin 中的私有构造函数

Posted

技术标签:

【中文标题】Kotlin 中的私有构造函数【英文标题】:Private constructor in Kotlin 【发布时间】:2018-04-01 13:04:11 【问题描述】:

在 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 会导致无法从类外部访问它,甚至不能从同一个文件访问。

【问题讨论】:

【参考方案1】:
This is the Answer

class Hide private constructor(val someData: Data) 



By declaring the constructor private, we can hiding constructor.

【讨论】:

虽然此代码可能会为问题提供解决方案,但最好添加有关其工作原理/方式的上下文。这可以帮助未来的用户学习并将这些知识应用到他们自己的代码中。在解释代码时,您也可能会以赞成票的形式从用户那里获得积极的反馈。 你的回复没有回答问题,两年前多次给出正确答案?【参考方案2】:

在此处查看 kotlin 文档:

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

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

class DontCreateMe private constructor ()  /*...*/ 

【讨论】:

【参考方案3】:

您甚至可以在拥有私有构造函数的同时做一些更类似于“模拟”公共构造函数的使用。

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

【讨论】:

【参考方案4】:

这可以使用伴随对象:

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

            return Foo(someData)
        
    

    // ...

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

【讨论】:

添加到这个是为了完整性。在 Java 中,您只能使用 Companion 调用伴随对象内的方法,例如 Foo.Companion.constructorA()。为了使其在 Java 中更自然,请使用 @JvmStatic 注释该方法,该方法将像静态方法一样运行(称为 Foo.constructorA())。

以上是关于Kotlin 中的私有构造函数的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin:为什么构造函数参数默认具有“内部”可见性?

kotlin之构造函数(constructor)

我们啥时候需要 C++ 中的私有构造函数?

Kotlin语言中的继承与构造函数(详解)

抽象类中的私有构造函数

Python中的私有构造函数