Spec-Zone.ru › Kotlin 2

Согласованнаявидимостьcopy

kotlin-stdlib/kotlin/ConsistentCopyVisibility

Начиная с Kotlin: 2.0

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

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

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

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

  1. Сгенерированный метод 'copy' будет иметь ту же видимость, что и первичный конструктор. Вы сразу переходите на новое поведение.

  2. Вы отключаете все предупреждения и ошибки об изменении поведения, поскольку они становятся ненужными.

Флаг '-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. В этом случае потребуется вручную реализовать все методы, генерируемые для класса данных.

См. также

ExposedCopyVisibility

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/-consistent-copy-visibility/index.html

Spec-Zone.ru

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