Не понимаю @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 геттер должен быть getCc(). Но я держу нарочно, для двусмысленности, разницу между именем геттера и фактической переменной)

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

@ConstructorProperties(value="text")

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

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

1 ответов


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

пример: someValue становится getSomeValue

имейте в виду, что имена параметров метода не отображается во время выполнения. Важен порядок параметров. Имена свойств и переменных, используемых в конструкторе, не имеют значения. Ниже все равно будет ссылаться на метод с именем getSomeValue().

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

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