Java Kotlin 中的私有构造函数
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/46847734/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Private constructor in Kotlin
提问by Marvin
In Java it's possible to hide a class' main constructor by making it private
and then accessing it via a public
static
method inside that class:
在 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;
}
// ...
}
How can the same be reached with Kotlin without separating the class into a public
interface and a private
implementation? Making a constructor private
leads to it not being accessible from outside the class, not even from the same file.
在不将类分为public
接口和private
实现的情况下,如何使用 Kotlin实现相同的功能?创建一个构造函数private
会导致它不能从类外部访问,甚至不能从同一个文件访问。
采纳答案by rafal
You can even do something more similar to "emulating" usage of public constructor while having private constructor.
您甚至可以在拥有私有构造函数的同时做一些更类似于“模拟”公共构造函数用法的事情。
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
回答by Marvin
This is possible using a companion object:
这可以使用伴随对象:
class Foo private constructor(val someData: Data) {
companion object {
fun constructorA(): Foo {
// do stuff
return Foo(someData)
}
}
// ...
}
Methods inside the companion object can be reached just like if they were members of the surrounding class (e.g. Foo.constructorA()
)
可以访问伴随对象中的方法,就像它们是周围类的成员一样(例如Foo.constructorA()
)
回答by Prasanth
See kotlin documentation here:
请参阅此处的 kotlin 文档:
https://kotlinlang.org/docs/reference/classes.html#constructors
https://kotlinlang.org/docs/reference/classes.html#constructors
https://kotlinlang.org/docs/reference/visibility-modifiers.html#constructors
https://kotlinlang.org/docs/reference/visibility-modifiers.html#constructors
class DontCreateMe private constructor () { /*...*/ }
回答by Abhinandan Chada
This is the Answer
class Hide private constructor(val someData: Data) {
}
By declaring the constructor private, we can hiding constructor.
回答by Omar
I've been coding in Java for a few years, and learning now Kotlin as a new language. From what I found while trying to make a Singleton without being able to call the constructor was to make a primary constructor in the class as private declared, and then calling your function (in my case the singleton) from a companion object like this.
我已经用 Java 编码几年了,现在正在学习 Kotlin 作为一种新语言。从我在尝试创建一个不能调用构造函数的单例时发现的是,在类中创建一个主构造函数作为私有声明,然后从这样的伴随对象调用你的函数(在我的情况下是单例)。
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
}
}}
and then calling the function from anywhere you want like that for example
然后从任何你想要的地方调用该函数,例如
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)
Eventhough the question is old, I still hope it helps some of you! You're welcome
尽管这个问题很老,但我仍然希望它对你们中的一些人有所帮助!别客气