Exposed Copy Visibility
Начиная с Kotlin: 2.0
annotation class ExposedCopyVisibility
В предыдущих версиях Kotlin сгенерированный метод 'copy' класса данных всегда имел уровень доступа public, даже если первичный конструктор был непубличным. Это открывало доступ к непубличному конструктору класса данных.
В будущих версиях Kotlin сгенерированный метод 'copy' класса данных будет иметь тот же уровень доступа, что и первичный конструктор.
Применяя аннотацию ExposedCopyVisibility к классу данных:
Вы выбираете сохранить публичную бинарную видимость сгенерированного метода 'copy'. Однако недопустимые вызовы метода 'copy' всё равно станут недоступны.
Вы подавляете предупреждение/ошибку об изменении поведения только в объявлении. Обратите внимание: предупреждение/ошибка для всех недопустимых вызовов метода '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. В этом случае необходимо вручную реализовать все методы, генерируемые для класса данных.
См. также
© 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