Kotlin - Как использовать свойство класса в объекте-компаньоне - PullRequest
0 голосов
/ 01 июня 2018

Мне было интересно, могу ли я использовать свойство класса внутри объекта-компаньона.например, возьмем приведенный ниже пример:

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)

Я не могу вызвать функцию changeAge () через c1 или c2.единственное место, где я могу использовать changeAge, - через Person1.changeAge (), когда Person1 не был создан с правильным конструктором.мне было интересно, есть ли альтернатива для этих действий или нет смысла иметь сопутствующие объекты в любом случае

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Вложение class в класс не дает автоматически доступ к экземпляру этого класса, в отличие от Java .То же самое относится к object с, включая companion object с.companion просто позволяет вам ссылаться на этот объект как Person1 в дополнение к Person1.myc.

Ваш fun constructor не является конструктором;это просто метод с именем constructor.

0 голосов
/ 01 июня 2018

Это относится к назначению сопутствующих объектов:

Я использую сопутствующие объекты для создания экземпляров членов, которые в 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 компаньона, который существует только один раз в памяти (например, член static в Java).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...