Как получить доступ к внешнему классу ' javaClass.simpleName из объекта-компаньона в Kotlin?
Я хотел бы иметь возможность доступа к simpleName моего класса из его сопутствующего объекта.
Я хотел бы это:
val o1 = Outer("foo")
val o2 = Outer("bar")
распечатать следующий вывод:
Outer: hello
Outer: foo
Outer: bar
Фактический вариант использования будет в Java:
class Outer {
static final String TAG = Outer.class.simpleName();
// and now I'm able to use Outer.TAG or just TAG in both static and non-static methods
}
Я попробовал 2 вещи:
назначьте simpleName Outer для объекта-компаньона COMPANION_TAG, а затем используйте COMPANION_TAG из init-компонента компаньона и для всех функций Outer. Я могу получить доступ к COMPANION_TAG из любого места, где мне нужно, но, к сожалению, я могу получить только "Companion", а не "Outer" таким образом.
получить доступ к Outer.OUTER_TAG из инициализации объекта-компаньона. Здесь проблема в том, что я не могу найти способ получить к нему доступ.
Вот код:
class Outer(str: String) {
private val OUTER_TAG = javaClass.simpleName
companion object {
@JvmStatic val COMPANION_TAG = PullDownAnimationLayout.javaClass.simpleName // gives "Companion" :(
init {
// how can I access OUTER_TAG?
Log.d(OUTER_TAG, "hello") // this gives an error
}
}
init {
Log.d(OUTER_TAG, str) // Outer: ... :)
Log.d(INNER_TAG, str) // Companion: ... :(
}
}
val o1 = Outer()
val o2 = Outer()
1 ответ
Чтобы достичь этого в Котлине,
class Outer {
static final String TAG = Outer.class.simpleName();
// and now I'm able to use Outer.TAG or just TAG in both static and non-static methods
}
Так должно быть
class Outer {
companion object {
val Tag = Outer::class.java.simpleName
val Tag2 = Outer.javaClass.simpleName // This will not work
}
}
println(Outer.Tag) // print Outer
println(Outer.Tag2) // print Companion
Я думаю, что вы неправильно поняли, что companion
является. companion
похож на статический Java. Смотрите это обсуждение.