Подтвердить что ты не робот

Не понимаю @ConstructorProperties

О @ConstructorProperties

Документация говорит: "Аннотации к конструктору, показывающие, как параметры этого конструктора соответствуют методам построения объекта объекта". И это дает пример, который неоднозначен, потому что имена переменных идентичны параметрам.

Я действительно не понимаю, почему @ConstructorProperties({"x", "y"}) относится к геттерам getX() и getY(). Случай x и y не согласуется с аннотацией.

Итак, чтобы уточнить, что должно быть аннотацией для конструктора в этом коде:

public class Point {
    public Point(int a, int b) {
       this.c = a;
       this.d = b;
   }

   public int getCc() {
       return c;
   }

   public int getDd() {
       return d;
   }

   private final int c, d;

}

(Я отредактировал код, потому что из ответа я понимаю, что аннотация предполагает, что код будет следовать за общим случаем для геттеров, например cc getter должен быть getCc(). Но я намеренно, для устранения неоднозначности, разницу между именем получателя и фактической переменной)

Второй вопрос...

@ConstructorProperties(value="text")

Что означает эта аннотация, для JButton (текст строки)?

Кажется, он предназначен для использования инструментами, но просто хочет понять.

4b9b3361

Ответ 1

@ConstructorProperties используется для сопоставления параметров конструктора с методами получения и установки. Для этого он использует те же общие соглашения об именах, которые используются при создании методов получения и установки для полей.

Getter и присваиватель метод обычно создаются прописными буквами имени поля и предваряя get или set (или is для булевого геттера). Пример использования отдельных букв не лучший, чтобы показать это.

Лучший пример: someValue становится getSomeValue

Таким образом, в контексте свойств конструктора @ConstructorProperties({"someValue"}) означает, что первый параметр сопоставляется с получателями с именами getSomeValue и setSomeValue.

Помните, что имена параметров метода не видны во время выполнения. Это порядок параметров, который имеет значение. Имена параметров конструктора или какие поля на самом деле установлены, конструктор не имеет значения. Следующее будет по-прежнему ссылаться на метод с именем getSomeValue().

@ConstructorProperties({"someValue"})
public Point(int a) {
    this.c = a;
}

Вариант использования для этой аннотации, кажется, (de-) сериализация неизменяемых объектов. Каркас получает все значения, используя объект getter, а затем сериализует объект. Когда объект должен быть десериализован, фреймворк должен создать новый экземпляр. Поскольку объект является неизменным, у него нет сеттеров. Конструктор - единственный способ установить эти значения, а аннотация используется, чтобы сообщить платформе, как построить сериализованный объект из сериализованных значений.