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 中的私有构造函数的主要内容,如果未能解决你的问题,请参考以下文章