Как рекомендуется создавать константы в Kotlin? А что такое соглашение об именах? Я не нашел этого в документации.
companion object {
//1
val MY_CONST = "something"
//2
const val MY_CONST = "something"
//3
val myConst = "something"
}
Или ...?
public static final
полю в Java, используйтеconst val
в своем объекте-компаньоне. Если вы хотитеprivate static final
поле и публичный метод получения, используйтеval
в своем объекте-компаньоне.Ответы:
В Kotlin, если вы хотите создать локальные константы, которые должны использоваться в классе, вы можете создать их, как показано ниже
И если вы хотите создать публичную константу в kotlin, как public static final в java, вы можете создать ее следующим образом.
источник
Constants.kt
или как?companion object
ответ, который, я думаю, @piotrpo должен быть принятИзбегайте использования сопутствующих объектов. За капотом создаются методы экземпляра getter и setter, чтобы поля были доступны. Вызов методов экземпляра технически дороже, чем вызов статических методов.
Вместо этого определите константы в
object
.Рекомендуемая практика :
и доступ к ним по всему миру, как это:
DbConstants.TABLE_USER_ATTRIBUTE_EMPID
источник
const val
отличить объект-компаньон от объектаconst val
обычного объекта (т. Е. Единственное различие между вашими примерами заключается в том, что вы опускаете егоconst
в случае объекта-компаньона - если вы добавитеconst
, примеры должны иметь одинаковую производительность)const val
s, объявление acompanion object
является правильным.Прежде всего , соглашение о присвоении имен в Kotlin для констант такое же, как и в Java (например, MY_CONST_IN_UPPERCASE).
Как мне его создать?
1. В качестве значения верхнего уровня (рекомендуется)
Вы просто должны поместить свой const за пределы объявления класса.
Две возможности : объявить ваше const в файле класса (ваше const имеет четкую связь с вашим классом)
Создайте специальный файл constants.kt, в котором будут храниться эти глобальные константы (здесь вы хотите широко использовать свой констант во всем проекте):
Тогда вам просто нужно импортировать его туда, где он вам нужен:
2. Объявите это в сопутствующем объекте (или объявлении объекта)
Это намного менее чисто, потому что под капотом, когда генерируется байт-код, создается бесполезный объект:
Еще хуже, если вы объявите его как val вместо const (компилятор сгенерирует бесполезный объект + бесполезную функцию):
Примечание :
В kotlin const может содержать только примитивные типы. Если вы хотите передать ему функцию, вам нужно добавить аннотацию @JvmField. Во время компиляции он будет преобразован как общедоступная статическая конечная переменная. Но это медленнее, чем с примитивным типом. Постарайся избежать этого.
источник
Значения, известные во время компиляции, могут (и, на мой взгляд, должны) быть помечены как постоянные.
Соглашения об именах должны следовать за Java и должны быть должным образом видны при использовании из кода Java (это трудно сделать с сопутствующими объектами, но в любом случае).
Правильные объявления констант:
источник
Naming conventions should follow Java ones
- Зачем?If in doubt, default to the Java Coding Conventions
Вам не нужен класс, объект или сопутствующий объект для объявления констант в Kotlin. Вы можете просто объявить файл, содержащий все константы (например, Constants.kt или вы также можете поместить их в любой существующий файл Kotlin), и напрямую объявить константы внутри файла. Константы, известные во время компиляции, должны быть помечены
const
.Итак, в этом случае должно быть:
const val MY_CONST = "something"
и затем вы можете импортировать константу, используя:
import package_name.MY_CONST
Вы можете обратиться к этой ссылке
источник
Если вы поставите свой
const val valName = valValue
перед именем класса, таким образом он создастpublic static final YourClass.Kt
это будет иметьpublic static final
значения.Котлин :
Java декомпилируется:
источник
у вас есть два варианта, вы можете использовать
const
ключевое слово или использовать,@JvmField
что делает его статической константой java.Если вы используете
@JvmField
аннотацию, то после ее компиляции константа вставляется для вас так, как вы бы назвали ее в Java.Как вы бы назвали это в Java, компилятор заменит это для вас, когда вы вызовете константу-компаньон в коде.
Однако, если вы используете ключевое слово const, тогда значение константы будет встроено. Под строкой я подразумеваю фактическое значение, используемое после его компиляции.
Итак, подведем итог, вот что компилятор сделает для вас:
источник
Статическое и постоянное значение Котлина и метод объявления
}
Доступ к стоимости в любом месте
источник
Например
val
, переменные, определенные с помощьюconst
ключевого слова, являются неизменными. Разница здесь в том, чтоconst
она используется для переменных, которые известны во время компиляции.Объявление переменной
const
очень похоже на использованиеstatic
ключевого слова в Java.Давайте посмотрим, как объявить переменную const в Kotlin:
И аналогичный код, написанный на Java, будет:
Добавление к ответам выше -
Статические поля
Обычно эти поля являются закрытыми, но их можно открыть одним из следующих способов:
@JvmField
аннотаций;lateinit
модификатор;const
модификатор.Более подробная информация здесь - https://kotlinlang.org/docs/reference/java-to-kotlin-interop.html#instance-fields
источник
Кое-что, что не упомянуто ни в одном из ответов, является накладными расходами на использование
companion objects
. Как вы можете прочитать здесь , сопутствующие объекты на самом деле являются объектами, и их создание потребляет ресурсы. Кроме того, вам может понадобиться выполнять более одной функции получения каждый раз, когда вы используете свою константу. Если все, что вам нужно, это несколько примитивных констант, вам, вероятно, будет лучше использовать их,val
чтобы получить лучшую производительность и избежатьcompanion object
.TL; DR; статьи:
Использование объекта-компаньона на самом деле превращает этот код
В этот код:
Поэтому старайтесь избегать их.
источник
местные константы:
Глобальные константы:
получить доступ к MyConstants.NAME
источник
Есть несколько способов определить константы в Kotlin,
Использование сопутствующего объекта
Вы можете использовать вышеуказанный блок сопутствующего объекта внутри любого класса и определить все свои поля внутри самого этого блока. Но есть проблема с этим подходом, документация говорит,
Когда вы создадите свои константы, используя объект-компаньон, и увидите декомпилированный байт-код , вы увидите что-то похожее ниже:
Отсюда вы можете легко увидеть то, что сказано в документации, даже если члены сопутствующих объектов выглядят как статические члены в других языках, во время выполнения они все еще являются экземплярами реальных объектов. Он выполняет дополнительную работу, чем требуется.
Теперь приходит другой способ, где нам не нужно использовать объект-компаньон, как показано ниже,
Опять же, если вы увидите декомпилированную версию байт-кода приведенного выше фрагмента, вы найдете что-то вроде этого,
Теперь, если вы видите выше декомпилированный код, он создает метод get для каждой переменной. Этот метод get не требуется вообще.
Чтобы избавиться от этих методов get , вы должны использовать const перед val, как показано ниже:
Теперь, если вы увидите декомпилированный код приведенного выше фрагмента, вам будет легче его читать, так как он выполняет наименьшее фоновое преобразование для вашего кода.
Так что это лучший способ создания констант.
источник
Для примитивов и струн:
Для других случаев:
Пример:
источник