web-dev-qa-db-ja.com

kotlinのオブジェクトインスタンスからコンパニオンオブジェクトにアクセスする方法は?

コンパニオンオブジェクトを含む単純なサンプルクラス

_class MyClass{
  companion object{
     val test = 25
  }
}
_

値テストには_MyClass.test_からアクセスできますが、MyClassのインスタンスからアクセスするにはどうすればよいですか? val sample = MyClass()がある場合、サンプルからテストにアクセスするにはどうすればよいですか? _sample::class.test_が正しくありません....方法はありますか?

質問が提起されました:「なぜ単にMyClass.testを使用しないのですか?」

私は「なぜ」ではなく「どのように」という質問を続けることを好みますが、質問されたので「なぜ」を試してみます。同じことがメソッドにも当てはまります。クラスに静的関数を入れて、Class.function()を呼び出し、オブジェクトをパラメーターの1つとして渡すのはなぜですか?

より抽象的な基本クラスとして渡されたオブジェクトを操作する場合は、操作するオブジェクトにいくつかのクラスを使用できることを考慮してください。

可能なクラスごとに切り替えを行い、適切なクラスから値(または関数)にアクセスすることもできますが、ポリモーフィズムの考え方は、メソッドのようなクラス属性にアクセスできる必要があるということです(関数メソッドコードであっても)同じクラスのすべてのメンバーの場合)またはそのクラスのオブジェクトのインスタンスからのクラスのすべてのメンバーに共通の値。

これまでの私の解決策は、静的なものとしてテストを使用してMyClassと同等のものを実装することです。

_public class MyClass {
    static Integer test = 25;
    public Integer testGetter(){ return test;}

}
_

Java、C++、pythonなどでこれに対する簡単な解決策があります...(それぞれのコードサンプルを提供します)そして私はkotlinでより良い解決策があると思いますJavaを使用するよりも。

Kotlinコンパニオンオブジェクトは、オブジェクトインスタンスなしでクラス属性にアクセスする状況(ファクトリなど)の静的な代替手段(および利点)を提供しますが、オブジェクトインスタンスが利用可能であるにもかかわらず、静的な別の使用法があります。単一の属性をクラスのすべてのメンバーで共有でき、属性はインスタンスに依存しないため、staticが適切です。

7
innov8

問題は、オブジェクトのプロパティは公開されていなければクラスの外部からアクセスできますが、コンパニオンオブジェクトのプロパティは公開されていないことです。これは、クラスの外部からアクセスされるコンパニオンオブジェクトプロパティのゲッター(および関連するセッター)を追加することを意味します。

class MyClass{
  companion object{
     val test = 25
  }
  var staticTest get() = test  // getter for test
}

アクセスに必要なのは::

sample.staticTest

または、コンパニオンオブジェクトへのアクセスを提供できます...

class MyClass{
    companion object{
        val test = 25
    }
    var companion = Companion
}

次に、コンパニオン内のすべてのものへのフルアクセスを許可します

3
innov8

リフレクションを使用すると、companionObjectを経由できます。

sample::class.companionObject?.memberProperties?.find { it.name == "test" }
4
s1m0nw1

このように静的変数をkotlinに使用するもう1つの方法です。

object AppConstant {
const val baseUrl : String = ""
const val KEY_PRODUCT_ITEM="productItem"
}

このようにプロジェクトのどこにでもアクセスできるとき。

AppConstant.KEY_PRODUCT_ITEM

それ以外の場合は、AppConstantをインポートします。その後、KEY_PRODUCT_ITEMのみを使用しました

2
Android Team