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

伴随对象的简单样本类

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

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

提出的问题是:为什么不简单地使用MyClass.test?

我更喜欢把问题保持在“如何”而不是“为什么”,但是因为有人问我会尝试“为什么”。 这同样适用于这些方法。 为什么不在类中有静态函数,只需调用Class.function()并将对象作为参数之一传递?

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

你可以做一个switch和每个possbile类,并以适当的方式访问相应类的值(或函数),但多态的想法是你应该能够访问类的方法(即使函数方法代码对于同一个类的所有成员而言),或者是来自该类的一个对象实例的所有类的成员共有的值。

到目前为止,我的解决方案是简单地实现相当于MyClass的静态测试

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

在Java,C ++,python等中有这样简单的解决方案…(我将提供代码样本,这对每个人都有帮助),我想在kotlin中会比使用Java更好的解决方案。

kotlin伴侣对象提供了静态的替代(有优势),用于在没有对象实例的情况下访问类属性的情况(如工厂),但是在对象实例可用的情况下还有另外一种静态的用法,静态是合适的,因为单个属性可以被类的所有成员共享,并且该属性不是实例相关的。

使用reflection,你可以通过companionObject

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

问题是虽然对象属性可以从类外部访问,只要它们不是公共的,而伴随对象的属性则不是。 这意味着添加getter(以及如果相关的setter)任何伴侣对象属性都可以从类的外部访问。

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

那么访问所需的全部是::

 sample.staticTest