suppress kotlin что это
Типы сообщений компилятора Kotlin, которые нужно использовать в Suppress
Предупреждения и ошибки, которые генерирует компилятор Kotlin часто нужно замаскировать, либо для того, чтобы они не мозолили глаза, либо просто потому, что логика программы нуждается именно в таком коде, который приводит к сообщению об ошибке или предупреждению.
Маскировка сообщений компилятора как в Java так и Kotlin происходит одинаково:
где «MESSAGE» — это тип сообщения.
Проблема в том, что узнать каким-то простым способом какой тип сообщения соответствует конкретному тексту часто оказывается невозможно. Подсказки Lint работают почему-то сильно не всегда, автодополнения нет, а разработчиками Kotlin эта информация почему-то нигде не опубликована.
Для облегчения поиска нужных типов сообщений я свел их вместе с текстом в одну таблицу. В случае возникновения необходимости замаскировать какое-то сообщение его можно легко найти в этой таблице и узнать какой тип нужно указать для ее подавления.
Пример таблицы
Тип | Сообщение |
---|---|
Data class inheritance from other classes is forbidden | DATA_CLASS_CANNOT_HAVE_CLASS_SUPERTYPES |
Data class must have at least one primary constructor parameter | DATA_CLASS_WITHOUT_PARAMETERS |
В один поста на хабре таблицу сообщений засунуть невозможно, а размазывать ее по нескольким сообщением не имеет смысла т.к. ею будет неудобно пользоваться, поэтому я выложил ее на GitHub.
Возможно, кому-то эта информация пригодится.
Документация Kotlin кода
Язык для документации Kotlin кода (являющийся аналогом Java JavaDoc) называется KDoc. По сути, KDoc комбинирует JavaDoc синтаксис для тегов (расширенных для поддержки специфичных Kotlin конструкций) и Markdown для встроенной разметки.
Генерация документации
Утилита для генерации Kotlin документации называется Dokka. Смотрите инструкцию по использованию Dokka README.
В Dokka есть плагины для Gradle, Maven и Ant, поэтому вы можете интегрировать создание документации в свой процесс сборки.
KDoc синтаксис
Ниже пример документации класса с использованием KDoc:
KDoc поддерживает следующие теги:
@param
Описание аргументов функции или типов параметров класса, свойств или функций. Для более удобного разделения названия параметра и его описания, при необходимости, можно заключать имя параметра в квадратные скобки. Два приведенных ниже синтаксиса равнозначны:
@return
Описание возвращаемого функцией значения.
@constructor
Описание первичного конструктора класса.
@receiver
Описание расширения функции.
@property
Описание свойства класса, имеющего указанное имя. Этот тег может использоваться для документации свойств указанных в основном кострукторе, где описание свойств прямо до их объявления выглядит нелепо.
Описание исключений которые может отправить класс. Поскольку Kotlin не имеет проверенных исключений, не ожидается, что все возможные исключения будут задокументированы, но вы можете использовать этот тег, когда он дает полезную информацию по работе класса.
@sample
Добавляется в тело функции с указанным именем элемента, чтобы показать пример того, как этот элемент можно использовать.
Добавляет ссылку на спецификацию класса или метода на See Also блок документации.
@author
Определяет автора документируемого элемента.
@since
Указывает версию программного обеспечения, в которой элемент был документирован.
@suppress
Исключает элемент из генерируемой документации. Может использоваться для элементов, которые не являются частью официального API, но до сих пор должны быть доступны.
KDoc не поддерживает @deprecated тег. Вместо него используйте @Deprecated аннотацию.
Встроенная разметка
Для встроенной разметки KDoc использует Markdown синтаксис, расширенный для поддержки сокращенного синтаксиса с возможностью привязки к другим элементам кода.
Привязка элементов
Для связи с элементом (классом, методом, свойством или параметром), достаточно указать его имя в квадратных скобках:
Если вы хотите ввести свое обозначение для ссылки, используйте следующий Markdown синтаксис:
Вы также можете использовать подходящее имя в ссылках. Заметьте, в отличие от JavaDoc, подходящее имя всегда использует точку для разделения компонентов, даже до имени метода:
На имена в ссылках действуют такие же правила, как и на имена использованные внутри документации. В частности, это означает, что если вы импортировали имя в текущий файл, вам не нужно полностью определять его, когда вы используете его в комментариях KDoc.
Заметьте, что KDoc не имеет синтаксиса для обозначения переопределенных функций. Поскольку Kotlin инструмент генерации документации добавляет все переопределенные методы в один файл, особое обозначение переопределенных функций не требуется для корректной работы ссылок.
Документирование модулей и пакетов
Внутри файла, документация для заголовка модуля и отдельных пакетов обозначается заголовком первого уровня. Текст заголовка должен содержать «Module » для модуля, и «Package
Ниже приведены примеры документации модулей и пакетов:
Типы сообщений компилятора Kotlin, которые нужно использовать в Suppress
Предупреждения и ошибки, которые генерирует компилятор Kotlin часто нужно замаскировать, либо для того, чтобы они не мозолили глаза, либо просто потому, что логика программы нуждается именно в таком коде, который приводит к сообщению об ошибке или предупреждению.
Маскировка сообщений компилятора как в Java так и Kotlin происходит одинаково:
где «MESSAGE» — это тип сообщения.
Проблема в том, что узнать каким-то простым способом какой тип сообщения соответствует конкретному тексту часто оказывается невозможно. Подсказки Lint работают почему-то сильно не всегда, автодополнения нет, а разработчиками Kotlin эта информация почему-то нигде не опубликована.
Для облегчения поиска нужных типов сообщений я свел их вместе с текстом в одну таблицу. В случае возникновения необходимости замаскировать какое-то сообщение его можно легко найти в этой таблице и узнать какой тип нужно указать для ее подавления.
Пример таблицы
Тип | Сообщение |
---|---|
Data class inheritance from other classes is forbidden | DATA_CLASS_CANNOT_HAVE_CLASS_SUPERTYPES |
Data class must have at least one primary constructor parameter | DATA_CLASS_WITHOUT_PARAMETERS |
В один поста на хабре таблицу сообщений засунуть невозможно, а размазывать ее по нескольким сообщением не имеет смысла т.к. ею будет неудобно пользоваться, поэтому я выложил ее на GitHub.
Возможно, кому-то эта информация пригодится.
Приведение и проверка типов
Умные приведения
или в случаях, когда приводимая переменная находится справа от оператора && или || :
Заметьте, что умные приведения не работают, когда компилятор не может гарантировать, что переменная не изменится между проверкой и использованием. Более конкретно, умные приведения будут работать:
Оператор «небезопасного» приведения
Обычно оператор приведения выбрасывает исключение, если приведение невозможно, поэтому мы называем его небезопасным. Небезопасное приведение в Kotlin выполняется с помощью инфиксного оператора as (см. приоритеты операторов):
Оператор «безопасного» (nullable) приведения
Чтобы избежать исключения, вы можете использовать оператор безопасного приведения as?, который возвращает null в случае неудачи:
Стирание и проверка типов у Обобщений (Generics)
` or `list is T` (type parameter). You can, however, check an instance against a [star-projected type](generics.html#star-projections):—>
Учитывая это, компилятор запрещает is-проверки, которые не могут быть выполнены во время выполнения программы из-за стирания типов, например ints is List или list is T (параметризированный тип). Однако у вас есть возможность произвести проверку со «Звёздными» проекциями:
Таким же образом, когда у вас есть статически определенный тип аргумента, вы можете произвести is-проверку или приведение с не-обобщенной частью типа. Заметье, что в данном случае угловые скобки пропущены:
Аналогичный синтаксис, с пропущенным типом аргумента может использоваться для приведений, которые не принимают типы аргументы: list as ArrayList
Встроенные (inline) функции с параметрами вещественного типа имеют свои аргументы типа, встроенные на каждый момент вызова, что позволяет arg is T проверку параметризованного типа, но если arg является объектом обобщенного типа, его аргумент типа по-прежнему стирается. Пример:
Непроверяемые (Unchecked) приведения
Как упоминалось выше, стирание типов делает невозможным проверку типа аргумента обобщения на этапе выполнения, и обобщенные типы в коде могут быть недостаточно связаны друг с другом, чтобы компилятор обеспечил типобезопасность.
Тем не менее, иногда мы имеем программную логику высокого уровня, которая вместо этого подразумевает типобезопасность. Например:
Чтобы избежать непроверяемые приведения, вы можете изменить структуру программы: в примере выше, возможно объявить интерфейсы DictionaryReader и DictionaryWriter с типобезопасными имплементациями для типизированного типа. Правильно использование вариативности обобщений также может помочь.
Для обобщенных функций, используемых встроенные (inline) функции с параметрами вещественного типа приведение типа arg as T является проверяемым, до тех пор, если тип arg не имеет свои аргументы типа, которые были стерты.
Предупреждение о непроверяемом приведении можно убрать используя аннотации
Kotlin Android Extensions deprecated. Что делать? Инструкция по миграции
kotlinx.android.synthetic is no longer a recommended practice. Removing in favour of explicit findViewById
Кратко о Kotlin Android Extensions
Kotlin Android Extensions — это плагин для Kotlin, позволяющий восстанавливать view из Activities, Fragments, и Views без написания стандартного бойлерплэйт-кода типа findViewById.
Плагин генерирует дополнительный код, который позволяет получить доступ к view в виде XML, так же, как если бы вы имели дело с properties с именем id, который вы использовали при определении структуры.
Также он создаёт локальный кэш view. При первом использовании свойства, плагин выполнит стандартный findViewById. В последующем, view будет восстановлен из кэша, поэтому доступ к нему будет быстрее.
Если это всё так удобно, то зачем его сделали deprecated?
Проблемы Kotlin Android Extensions
Альтернативные способы
View Binding от Google
Итак, победителем в этом списке выглядит ViewBinding от Google (не путайте с DataBinding). Давайте кратко рассмотрим, что это такое.
View Binding — это инструмент, который позволяет проще писать код для взаимодействия с view. При включении View Binding в определенном модуле он генерирует binding классы для каждого файла разметки (layout) в модуле. Объект сгенерированного binding класса содержит ссылки на все view из файла разметки, для которых указан android:id
Главные преимущества View Binding — это Null safety и Type safety.
Начало работы с View Binding
Начать работать с ViewBinding достаточно просто. Нужно добавить опцию в build.gradle:
После этого можно уже использовать. Каждый сгенерированный binding класс содержит ссылку на корневой view разметки (root) и ссылки на все view, которые имеют id. Имя генерируемого класса формируется как «название файла разметки», переведенное в camel case + «Binding». Например, для файла разметки result_profile.xml:
Будет сгенерирован класс ResultProfileBinding, содержащий 2 поля: TextView name и Button button.
Использование в Activity
Например у вас вот такой layout:
Результат работы ViewBinding:
Использовать viewBinding можно так:
И теперь, после того, как получили ссылки на view:
Если вы используете ViewBinding во фрагменте и держите ссылку на binding во фрагменте (а не только в методе onCreateView()) то не забывайте очищать ссылки в методе onDestroyView().
Это необходимо делать из-за жизненного цикла фрагмента и view: