Spec-Zone.ru › Kotlin 2

ExposedCopyVisibility

kotlin-stdlib/kotlin/ExposedCopyVisibility

Начиная с Kotlin: 2.0

@Target(allowedTargets = [AnnotationTarget.CLASS])
annotation class ExposedCopyVisibility

В предыдущих версиях Kotlin сгенерированный метод 'copy' класса данных всегда имел уровень доступа public, даже если первичный конструктор был непубличным. Это открывало доступ к непубличному конструктору класса данных.

В будущих версиях Kotlin сгенерированный метод 'copy' класса данных будет иметь тот же уровень доступа, что и первичный конструктор.

Применяя аннотацию ExposedCopyVisibility к классу данных:

  1. Вы выбираете сохранить публичную бинарную видимость сгенерированного метода 'copy'. Однако недопустимые вызовы метода 'copy' всё равно станут недоступны.

  2. Вы подавляете предупреждение/ошибку об изменении поведения только в объявлении. Обратите внимание: предупреждение/ошибка для всех недопустимых вызовов метода 'copy' останется, даже если вы используете ExposedCopyVisibility!

График устаревания

  • Этап 1. Kotlin 2.0.20. Компилятор выдаёт предупреждение об изменении поведения в объявлении класса данных и при недопустимых вызовах метода 'copy' (недопустимыми считаются вызовы, которые к концу миграции станут недоступны). Подавить предупреждение в объявлении можно с помощью аннотаций ConsistentCopyVisibility/ExposedCopyVisibility или флага '-Xconsistent-data-class-copy-visibility'. Для недопустимых вызовов следует начать миграцию.

  • Этап 2. (Предположительно, Kotlin 2.1 или Kotlin 2.2). Предупреждения становятся ошибками. Имейте в виду, что компилятор по-прежнему генерирует public-метод 'copy'. Бинарная сигнатура сохраняется. Подавить ошибку в объявлении можно с помощью аннотаций ConsistentCopyVisibility/ExposedCopyVisibility или флага '-Xconsistent-data-class-copy-visibility'. Подавить ошибку для недопустимых вызовов метода 'copy' невозможно. Недопустимые вызовы необходимо перенести.

  • Этап 3. (Предположительно, Kotlin 2.2 или Kotlin 2.3). Поведение по умолчанию меняется. Если не используется ExposedCopyVisibility, сгенерированный метод 'copy' имеет тот же уровень доступа, что и первичный конструктор. Бинарная сигнатура меняется. Ошибка в объявлении больше не выдаётся. Флаг компилятора '-Xconsistent-data-class-copy-visibility' и аннотация ConsistentCopyVisibility становятся ненужными.

Примечания:

  • Точное соответствие этапов устаревания версиям Kotlin см. в задаче KT-11914.

  • Вы можете превратить предупреждение в ошибку с помощью флага компилятора '-progressive'/'-Werror'.

Рекомендации и альтернативы

  • Если вы пишете новый код или бинарная совместимость для вас не важна, рекомендуется использовать ConsistentCopyVisibility (или флаг компилятора '-Xconsistent-data-class-copy-visibility') вместо ExposedCopyVisibility.

  • При использовании ExposedCopyVisibility также рекомендуется использовать '-Xconsistent-data-class-copy-visibility' в том же модуле. Так поведение старых классов не изменится, а новые классы будут иметь правильный уровень доступа метода 'copy'.

  • После миграции всех недопустимых вызовов метода 'copy' удалите аннотацию ExposedCopyVisibility.

  • Вы можете добавить собственный метод, подобный 'copy', наряду со сгенерированным методом 'copy' и перенести все вызовы на добавленный метод.

  • Вы можете заменить класс данных обычным классом Kotlin. В этом случае необходимо вручную реализовать все методы, генерируемые для класса данных.

См. также

ConsistentCopyVisibility

KT-11914

© 2010–2026 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-exposed-copy-visibility/index.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API