如何从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