Intereting Posts
Когда использовать методы расширения? Ошибка комнаты в Android: TypeConverter не распознается для списка перечислений Почему выражения лямбда ведут себя по-разному для классов Kotlin и Java? Не удалось синхронизировать Gradle: не удалось GET 'https://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-gradle-plugin/1.1.3-2/kotlin-gradle-plugin-1.1.3-2.pom' kotlin unreachable code при использовании finally и enum Преобразование java в kotlin Невозможно предоставить квалифицированную строку с помощью Dagger2 Kotlin с трудом подводит итог к предполагаемому (на месте) параметру Как создать экземпляр абстрактного класса в Котлине? Атрибут свойства lateinit не был инициализирован в Kotlin4Android Какой тип языка Котлин? Чистый ООП или функциональный android studio "ошибка: не удается найти или загрузить основной класс" в основном методе файла Kotlin Как программно добавить вид в макет Constraint? Создание кеша ehcache в Котлине Spring Data JPA Как использовать ноль Kotlin вместо необязательного

Kotlin – любая замена сопутствующего объекта внутри другого объекта (не класса)?

Я хотел бы, чтобы в моем приложении Android Kotlin был создан объект singleton с некоторыми статическими определениями его внутренних состояний.

Как я понимаю, object в Котлине для одиночного толка, поэтому я пытаюсь использовать такой подход:

 object MySingleton { public const val _DEF_DEFINITION_NO_ONE: Byte = 1; public const val _DEF_DEFINITION_NO_TWO: Byte = 2; (...) } 

Это прекрасно, но проблема в том, что, чтобы использовать эти определения, я должен сначала создать экземпляр объекта.

Просто интересно, могу ли я в Котлине создать такую ​​конструкцию и получить доступ к этим определениям без создания экземпляра MySingleton ? Ответ был бы companion object работающим аналогичным static в других языках, но он не допускается внутри объектов, только внутри классов.

Конечно, я могу оставить это как есть или сделать эти определения глобальными, но хотел бы знать, можно ли это сделать так, как я описал? Или, может быть, мне еще нужно разработать это еще?

Как вы сказали, MySingleton – это object и, таким образом, синглтон . Нет необходимости создавать экземпляр (даже не возможно). Вы просто получаете доступ к его константам статическим способом: MySingleton._DEF_DEFINITION_NO_ONE .

Если вы хотите использовать константы без префикса имени object , просто импортируйте их с полным именем и используйте его следующим образом:

 import package.MySingleton._DEF_DEFINITION_NO_ONE //... println(_DEF_DEFINITION_NO_ONE) 

Существует два способа работы со статическими данными в Котлине:

object

 object ASingleton { val CONSTANT_PROPERTY: Int = 1; } 

Если вам нужен один класс экземпляра, который имеет только одно состояние для каждого свойства, используйте одноэлемент. Примечание. Может быть только один экземпляр этого класса, и он создан для вас компилятором.

Класс со companion object

 class ClassWithCompanionObject{ val someProperty: Int = 0; // instance bound companion object { val CONSTANT_PROPERTY: Int = 1; } } 

Если вам нужны некоторые статические свойства, а остальное должно иметь состояние, привязанное к определенному экземпляру, перейдите к классу со companion object .

Применение:

 println(ASingleton.CONSTANT_PROPERTY) println(ClassWithCompanionObject.CONSTANT_PROPERTY)