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.
在 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.