带伴随对象的简单示例类
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伴随对象为静态提供了一种替代(并且具有优势),但是对于尽管对象实例可能是可用,静态是合适的,因为类的所有成员可以共享单个属性,并且该属性不依赖于实例。
答案 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