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
を作成すると、クラスの外部からも、同じファイルからでもアクセスできなくなります。
プライベートコンストラクターを使用しながら、パブリックコンストラクターの使用を「エミュレート」することと似たようなこともできます。
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
これは、コンパニオンオブジェクトを使用して可能です。
_class Foo private constructor(val someData: Data) {
companion object {
fun constructorA(): Foo {
// do stuff
return Foo(someData)
}
}
// ...
}
_
コンパニオンオブジェクト内のメソッドは、周囲のクラスのメンバーであるかのように到達できます(例:Foo.constructorA()
)