Страницы

Поиск по вопросам

понедельник, 15 июля 2019 г.

Companion object в Kotlin

Только перехожу с Java на Kotlin. Возник вопрос, ответ на который, к сожалению, я не смог найти. Существует некий абстрактный класс с несколькими абстрактными переменными, на который потом будут ложиться десятки тестов. Тестирую с помощью JUnit. Методы аннотированные @BeforeClass и @AfterClass обязаны быть статичными, и я вижу только один способ разрешения пробелемы: запихнуть методы внутрь companion object, где можно использовать @JvmStatic, но при этом, в методе @BeforeClass вызывается абстрактная переменная, задаваемая каждой реализацией отдельно. Соответсвенно, каким образом можно обратиться к переменной из внешнего класса? Или может быть есть другой способ разрешения такой задачи? Код:
abstract class TemplateConfig {
abstract val template : String?
companion object { lateinit var h: Handle
@BeforeClass @JvmStatic fun setUp() { h = dbi.value.open() //Здесь используется абстрактная переменная // //if (template != null) { // h.createStatement(template).execute() //} }
@AfterClass @JvmStatic fun tearDown() { h.close() }
//{...Объявление и инициализация других переменных...} } }


Ответ

Если я правильно понял, вы пытаетесь в статическом методе обратиться к нестатической переменной/методу которая задается в классе потомке. Так не выйдет. Единственное решение, которое я вижу, это определить поле статическим и при инициализации класса-потомка задать ему значение.
object Demo { protected var value:String @BeforeClass fun setUp() { println(value) } @AfterClass fun destroy() { } } internal class SubClass:Demo() { companion object { init { Demo.value = "this is value" } } }

Комментариев нет:

Отправить комментарий