Объект Kotlin vs companion-object vs package методы
Я написал эти методы в Котлине и проанализировал байт-код:
Ситуация 1
class A { object b { fun doSomething() {} } }
Ситуация 2
class A { companion object b { fun doSomething() {} } }
Ситуация 3
fun doSomething() {}
Результат байткода
- Ситуация 1:
Test$asb
классаTest$asb
,public final doSomething()I
- Ситуация 2:
Test$Companion
классаTest$Companion
,public final doSomething()I
- Ситуация 3: класс
TestKt
,public final static doSomething()I
Мои вопросы:
- Kotlin, получающий доступ к членам сопутствующих объектов в производных типах
- Почему я не вижу компонент вспомогательного объекта расширенного класса?
- Ошибка приложения из-за того, что экземпляр экземпляра lateinit не инициализирован
- Kotlin - Возможно ли инициализировать объект-компаньон перед блоком init в классе?
- kotlin, как добавить функцию расширения к уже определенному классу сопутствующего объекта
-
У меня есть класс enum, и я хочу вернуть enum instace с переменной enum, например findById
(enum(id, color))
. Как мне это сделать? Сопутствующий объект? объект? -
Кажется, единственный способ иметь реальный статический метод на уровне пакета, без объявления класса. Но это становится немного слишком глобальным. Есть ли способ получить к нему доступ через:
ClassName.staticMethod
, staticMethod действительно статичен. -
Предоставьте значащие примеры методов объявления пакета, объекта и объекта сопутствующих объектов.
Контекст. Я кодировал в Котлине, и я нахожу это удивительным. Но иногда мне нужно принять решение: например, тяжелое неизменяемое свойство, которое в java я объявляю статичным окончательным, но в Котлине мне трудно «найти эквивалент».
- Как я могу ссылаться на сопутствующие объекты из Java?
- Сопутствующие объекты скрывают класс-ошибку или функцию?
- Методы доступа за пределами объекта-компаньона - Котлин
- Как объявить параметр расширения для общих помощников перечислений
- Kotlin: Разница между объектом и сопутствующим объектом в классе
- Объекты Companion - Android хочет зарегистрировать их как действия (?)
- как получить доступ к сопутствующему объекту из экземпляра объекта в kotlin?
Я бы предложил разработать воддан ответ :
enum class Color { RED, BLUE, GREEN; companion object Utils { fun findById(color: Color): Color { return color; } } }
И проверить
@Test fun testColor() { println(Color.Utils.findById(Color.valueOf("RED"))); }
Если у вас есть функция, которая выполняет некоторые действия, тесно связанные с классом, но не требует экземпляр класса, например, пример findById
, вы должны поместить его в объект-компаньон класса.
Если вы хотите выставить метод как статический метод для Java-кода, вы можете аннотировать его с @JvmStatic
аннотации @JvmStatic
.
Если функции не требуется экземпляр класса, то это ваше дизайнерское решение, куда его поставить. Используйте уровень пакета, если он специфичен для пакета, используйте компаньона класса, если он близко относится к классу (например, другие классы в пакете имеют схожие функции).
Обратите внимание, что enum
имеет несколько встроенных свойств и шаблонов:
enum class Colour(val value: Int) { black(100), red(200), green(300) } fun colourById(id: Int) = Colour.values[id] fun colourByValue(value: Int) = Colour.values.first {it.value == value} fun colourByName(name: String) = Colour.valueOf(name)