在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
导致它无法从类外部访问,甚至不能从同一文件中访问。
答案 0 :(得分:39)
在使用私有构造函数时,您甚至可以执行更类似于“模拟”公共构造函数的使用。
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
答案 1 :(得分:10)
使用伴侣对象可以做到这一点:
class Foo private constructor(val someData: Data) {
companion object {
fun constructorA(): Foo {
// do stuff
return Foo(someData)
}
}
// ...
}
可以访问随播对象内的方法,就像它们是周围类的成员一样(例如Foo.constructorA()
)
答案 2 :(得分:4)
在此处查看kotlin文档:
https://kotlinlang.org/docs/reference/classes.html#constructors
https://kotlinlang.org/docs/reference/visibility-modifiers.html#constructors
class DontCreateMe private constructor () { /*...*/ }
答案 3 :(得分:0)
我从事Java编程已有几年了,现在学习Kotlin作为一种新语言。 从我试图创建Singleton而不调用构造函数的过程中发现,是在类中将一个主构造函数声明为private声明,然后从这样的伴随对象调用函数(在我的情况下为Singleton)。
open class Singleton private constructor() {
fun produceSomeChicken(): String {
return "CHICKEN"
}
companion object {
private var INSTANCE : Singleton? = null
fun getInstance(): Singleton {
if (INSTANCE == null) {
println("IS NULL")
INSTANCE = Singleton()
println("INSTANCE CREATED")
}
return INSTANCE as Singleton
}
}}
然后从所需的任何地方调用该函数
println(Singleton.getInstance().produceSomeChicken()) //instance created without calling constructor
//println(Singleton().produceSomeChicken()) //is not possible to call, prevented by using private constructor (gives back compile error)
尽管问题很旧,但我仍然希望它能对您有所帮助!不客气
答案 4 :(得分:-1)
This is the Answer
class Hide private constructor(val someData: Data) {
}
By declaring the constructor private, we can hiding constructor.