Как получить доступ к внешнему классу ' 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 вещи:

  1. назначьте simpleName Outer для объекта-компаньона COMPANION_TAG, а затем используйте COMPANION_TAG из init-компонента компаньона и для всех функций Outer. Я могу получить доступ к COMPANION_TAG из любого места, где мне нужно, но, к сожалению, я могу получить только "Companion", а не "Outer" таким образом.

  2. получить доступ к 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. Смотрите это обсуждение.

Другие вопросы по тегам