Согласованная видимость copy
Начиная с Kotlin: 2.0
annotation class ConsistentCopyVisibility
В предыдущих версиях Kotlin сгенерированный метод 'copy' класса данных всегда имел публичную видимость, даже если первичный конструктор был непубличным. Это делало непубличный конструктор класса данных доступным.
В будущих версиях Kotlin сгенерированный метод 'copy' класса данных будет иметь ту же видимость, что и первичный конструктор.
Применяя аннотацию ConsistentCopyVisibility к классу данных с непубличным конструктором:
Сгенерированный метод 'copy' будет иметь ту же видимость, что и первичный конструктор. Вы сразу переходите на новое поведение.
Вы отключаете все предупреждения и ошибки об изменении поведения, поскольку они становятся ненужными.
Флаг '-Xconsistent-data-class-copy-visibility' действует так же, как применение ConsistentCopyVisibility ко всем классам данных в модуле.
График отказа от поддержки
Этап 1. Kotlin 2.0.20. Компилятор предупреждает об изменении поведения при объявлении класса данных и при недопустимом использовании метода 'copy' (недопустимым считается использование, которое к концу переходного периода станет невозможным из-за отсутствия видимости). Предупреждение при объявлении можно подавить с помощью аннотаций ConsistentCopyVisibility/ExposedCopyVisibility или флага '-Xconsistent-data-class-copy-visibility'. Для недопустимых вариантов использования следует начать переход.
Этап 2. (Предположительно, Kotlin 2.1 или Kotlin 2.2). Предупреждения превращаются в ошибки. Обратите внимание, что компилятор по-прежнему генерирует публичный метод '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/-consistent-copy-visibility/index.html