Ограничение объекта-компаньона Kotlin относительно отражения и наследования - PullRequest
1 голос
/ 20 апреля 2019

Предположим:

  • Мне нужно много сопутствующих (статических) методов для подклассов Parent
  • Мне нужно много методов (нестатических) для подклассов Parent
  • У меня более 50 подклассов Parent
  • clazz и некоторые другие поля должны вычисляться для каждого класса (не экземпляра) из-за производительности
  • Ожидайте, что методы Companion и не-Companion используют вычисляемые элементы (например: clazz)
  • И последнее, но не менее важное: Parent и MyCompanion могут иметь сложную логику, но подклассы Parent, такие как Child, должны быть в максимально простой форме

Вопрос:

как получить правильное имя класса Child в обоих приведенных ниже выражениях:

Child().printClass()
Child.printClassUsingCompanion()

Код: ПОПРОБУЙТЕ

open class MyCompanion {
  var clazz = this::class.java.declaringClass.name
  // and many more members that will compute using reflection with complex logic
  fun printClassUsingCompanion() = println(clazz)
}

open class Parent {
  companion object : MyCompanion()
  fun printClass() = println(clazz)
}

class Child: Parent() {
  companion object : MyCompanion()
}

fun main() {
  Child().printClass()              //output: Parent
  Child.printClassUsingCompanion()  //output: Child
}
...