【问题标题】:Kotlin - How to use a class property in a companion objectKotlin - 如何在伴随对象中使用类属性
【发布时间】:2018-06-01 11:18:06
【问题描述】:

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

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() 。 我想知道这些操作是否有替代方法,或者无论如何都没有伴随对象的意义

【问题讨论】:

  • 我真的很想知道你认为是什么是伴生对象。您所描述的是Person 类的成员函数的语义。

标签: kotlin


【解决方案1】:

在类doesn't automatically give you access to an instance of this class, unlike in Java 中嵌套class。这同样适用于objects,包括companion objects。 companion 仅允许您将此对象称为 Person1 以及 Person1.myc

您的fun constructor 不是构造函数;它只是一个名为constructor 的方法。

【讨论】:

【解决方案2】:

这是关于伴随对象的目的:

我使用伴生对象来实例化在 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 成员)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-02
    • 1970-01-01
    • 2021-12-15
    • 2016-05-21
    • 1970-01-01
    • 2017-10-04
    • 1970-01-01
    相关资源
    最近更新 更多