Kotlin - 如何在伴随对象中使用类属性

时间:2018-06-01 11:18:06

标签: kotlin

我想知道我是否可以在伴侣对象中使用类的属性。例如,以下面的实例:

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()。 我想知道是否有替代这些行动或者如果不存在具有伴侣物体的重点

2 个答案:

答案 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成员)。