web-dev-qa-db-ja.com

Kotlinのプライベートコンストラクター

Javaでは、クラスのメインコンストラクターをprivateにして、その中のpublicstaticメソッドを介してアクセスすることで非表示にすることができます。クラス:

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を作成すると、クラスの外部からも、同じファイルからでもアクセスできなくなります。

28
Marvin Meller

プライベートコンストラクターを使用しながら、パブリックコンストラクターの使用を「エミュレート」することと似たようなこともできます。

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
45
rafal

これは、コンパニオンオブジェクトを使用して可能です。

_class Foo private constructor(val someData: Data) {
    companion object {
        fun constructorA(): Foo {
            // do stuff

            return Foo(someData)
        }
    }

    // ...
}
_

コンパニオンオブジェクト内のメソッドは、周囲のクラスのメンバーであるかのように到達できます(例:Foo.constructorA()

12
Marvin Meller