我想知道我是否可以在伴侣对象中使用类的属性。例如,以下面的实例:
class Person1(val name: String, var age: Int){
lateinit var surname: String
companion object myc{
var cname: String =""
var cage: Int = 0
fun constructor(cname: String, cage: Int){
this.cage = cage
this.cname = cname
}
fun changeAge(age: Int ?= 0){
// access to surname or name or age
}
}
}
我无法访问Person1类
中的任何属性例如,假设我们将类或伴随对象称为如下:
val c1 = Person1.myc.constructor("john",10)
val c2= Person1("jack",20)
我无法通过c1或c2调用changeAge()函数。当Person1尚未使用适当的构造函数进行实例化时,唯一可以使用changeAge的地方是通过Person1.changeAge()。 我想知道是否有替代这些行动或者如果不存在具有伴侣物体的重点
答案 0 :(得分:1)
将class
嵌套在班级doesn't automatically give you access to an instance of this class, unlike in Java中。这同样适用于object
s,包括companion object
s。除了companion
之外,Person1
只允许您将此对象称为Person1.myc
。
您的fun constructor
不是构造函数;它只是一个名为constructor
的方法。
答案 1 :(得分:0)
这是关于伴侣对象的目的:
我使用随播对象来实例化Java中通常为static
的成员。
例如,如果您有JUnit 4测试,并且您要测试的主要服务是静态的,并且您想要使用@BeforeClass
类注释。这就是你能做的:
class ExcelDedupReportGeneratorTest {
companion object {
init {
// things that may need to be setup before companion class member variables are instantiated
}
// variables you initialize for the class just once:
var reportGenerator: ExcelReportGenerator? = null
@BeforeClass @JvmStatic fun setup() {
val messageSource = Mockito.mock(MessageSource::class.java)
reportGenerator = ExcelDedupReportGenerator(messageSource)
}
}
@Test
fun whenWrite_ShouldWriteFile() {
Files.newOutputStream(Paths.get("demoReport-dedup.xls")).use {
reportGenerator?.write(ReportBeanProvider.createReportData(), it)
}
}
}
在这种情况下,测试类访问协同服务器的reportGenerator
元素,该元素在内存中只存在一次(如Java中的static
成员)。