首页 文章

如何从kotlin中的对象实例访问伴侣对象?

提问于
浏览
1

带伴随对象的简单示例类

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

可以通过 MyClass.test 访问值测试,但是如何从MyClass实例访问?如果我有 val sample = MyClass() ,那么如何从样本中访问测试? sample::class.test 不正确....有办法吗?

问题已经提出:'为什么不简单地使用MyClass.test'?

我更倾向于将问题保持为'如何'而不是'为什么',但因为有人问我会尝试'为什么' . 这同样适用于这些方法 . 为什么不在类中使用静态函数并简单地调用Class.function()并将对象作为参数之一传递?

在使用作为更抽象的基类传递的对象时,请考虑使用您正在使用的对象的几个类 .

您可以为每个可能的类进行切换并从相应的类中访问值(或函数),但多态的想法是您应该能够像方法一样访问类属性(即使函数方法代码对于同一类的所有成员)或该类的对象的实例对该类的所有成员共同的值 .

到目前为止,我的解决方案是简单地使用test作为静态实现MyClass的等价物

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

}

在Java,C,python等中有简单的解决方案....(我将为每个提供代码示例有帮助)我认为在kotlin中将有一个比使用Java更好的解决方案 .

对于在没有对象实例(如工厂)的情况下访问类属性的情况,kotlin伴随对象为静态提供了替代(并且具有优势),但是对于尽管可以使用对象实例的情况,还有另一种静态用法, static是合适的,因为类的所有成员都可以共享单个属性,并且该属性不依赖于实例 .

3 回答

  • 1

    使用反射,您可以通过 companionObject

    sample::class.companionObject?.memberProperties?.find { it.name == "test" }
    
  • 0

    问题是虽然对象属性可以从类外部访问,只要它们不是公共的,但是伴随对象的属性不是公共的 . 这意味着为要在类外部访问的任何伴随对象属性添加getter(以及相关的setter) .

    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

    这是另一种将静态变量用于kotlin的方式,就像这样 .

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

    什么时候访问任何进入项目的方式..

    AppConstant.KEY_PRODUCT_ITEM
    

    其他明智的导入AppConstant . 然后只使用KEY_PRODUCT_ITEM

相关问题