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

时间:2017-10-19 09:44:16

标签: kotlin companion-object

带伴随对象的简单示例类

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

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

提出了一个问题:'为什么不简单地使用MyClass.test'?

我更愿意将问题保留为''而不是为什么'但是因为有人问我会尝试“为什么&#39 ;.这同样适用于这些方法。为什么不在类中使用静态函数并简单地调用Class.function()并将对象作为参数之一传递?

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

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

到目前为止,我的解决方案是简单地使用test作为静态

实现MyClass的等价物
public class MyClass {
    static Integer test = 25;
    public Integer testGetter(){ return test;}

}

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

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

3 个答案:

答案 0 :(得分:3)

使用反射,您可以通过companionObject

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

答案 1 :(得分:2)

问题是虽然对象属性可以从类外部访问,但它们不是公共的,但是伴随对象的属性不是公共的。这意味着为要在类外部访问的任何伴随对象属性添加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
}

然后允许完全访问随附的任何内容

答案 2 :(得分:1)

这是将静态变量用于kotlin的另一种方法。

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

以这种方式访问​​项目的任何位置时。

AppConstant.KEY_PRODUCT_ITEM

其他方式导入AppConstant。然后只使用了KEY_PRODUCT_ITEM