プライベートコンストラクターを持ち、コンパニオンオブジェクト内でメソッドを使用してクラスをインスタンス化することの利点は何ですか?

チアゴサライバ

私はこのコードにぶつかりましたが、なぜ誰かがこれを行うのかわかりません。基本的に、作成者はクラスコンストラクターをプライベートにして、ファイルの外部でインスタンス化できないようにすることを決定し、このクラスの新しいインスタンスを作成するクラスのコンパニオンオブジェクトにパブリックメソッドを追加しました。このアプローチの利点は何ですか?

これは私が見つけたものです:

class Foo private constructor(private val arg1: Any) {
    //more code here..
    companion object {
        fun newFoo(arg1: Any) = Foo(arg1 = arg1)
    }
}

なぜこれより良いのですか?

class Foo(private val arg1: Any) {
    //more code here..
}
ギッド

パブリックコンストラクタの代わりにファクトリメソッドを提供することには、次のようないくつかの利点があります。

  • 委託者に電話する前に、多くの処理を行うことができます。(これは、スーパークラスコンストラクターが計算する必要のあるパラメーターを受け取る場合に重要になる可能性があります。)

  • 必要に応じて、新しいインスタンスの代わりにキャッシュされた値を返すことができます。

  • サブクラスを返すことができます。(これにより、別の回答に記載されているように、最上位クラスをインターフェイスにすることができます。)正確なクラスは呼び出し間で異なる場合があり、匿名型にすることもできます。

  • 名前を付けることができます(別の回答に記載されています)。これは、同じパラメーターを使用する複数のメソッドが必要な場合に特に重要です。(たとえば、長方形または極座標から構築できるPointオブジェクト。)ただし、ファクトリメソッドには特定の名前必要ありませんinvoke()コンパニオンオブジェクトにメソッドを実装する場合、コンストラクターとまったく同じ方法でメソッドを呼び出すことができます。

  • パブリックインターフェイスに影響を与えることなく、クラスの実装を簡単に変更できます。

また、重要な欠点もあります。

  • サブクラスコンストラクターでは使用できません。

ファクトリメソッドは、JavaよりもKotlinで使用されていないようです。これは、おそらくKotlinのプライマリコンストラクタとプロパティの構文が単純なためです。ただし、特にKotlinコンパニオンオブジェクトは継承できるため、検討する価値はあります。

より詳細な情報については、Effective Javaでの推奨事項と、それがKotlinにどのように適用されるかを説明するこの記事を参照してください

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ