带伴随对象的简单示例类
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 回答
使用反射,您可以通过
companionObject
:问题是虽然对象属性可以从类外部访问,只要它们不是公共的,但是伴随对象的属性不是公共的 . 这意味着为要在类外部访问的任何伴随对象属性添加getter(以及相关的setter) .
然后访问所需的一切是::
或者您可以提供对伴随对象的访问权限......
然后允许完全访问同伴中的任何内容
这是另一种将静态变量用于kotlin的方式,就像这样 .
什么时候访问任何进入项目的方式..
其他明智的导入AppConstant . 然后只使用KEY_PRODUCT_ITEM