Как написать пользовательскую аннотацию для поля, которая создаст пользовательский установщик для этого поля? - PullRequest
1 голос
/ 26 апреля 2019

У меня следующий класс.

public class X {
    private int a1;
    private int a2;
    private int a3;
    private int a4;
    .
    .
    .
    private int a100;
    // name of fields are different in actual class(but there are sure 100 fields)
}

Теперь я не хочу присваивать отрицательное значение ни одному из полей int. Таким образом, для этого мне нужно написать setter для всего этого (это будет очень полезно написать setter (который будет устанавливать только положительное значение) для всех полей).

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

Изучая «Как написать пользовательскую аннотацию в Java», я обнаружил, что мы можем написать аннотацию для поля (которое назначает значение по умолчанию для этого поля) для методов, но не получая ничего для « обычного аннотации для полей» который создаст сеттер для этих полей".

Примечание: - Я также рассмотрел lombok setter , но он генерирует только обычный установщик, а не пользовательский установщик, как я хочу.

1 Ответ

2 голосов
/ 26 апреля 2019

Если вы используете IntelliJ IDEA, вы можете добавить новый шаблон для этого.

Поместите курсор в ваш класс и перейдите в Code -> Generate. В меню выберите «Сеттер». Затем нажмите «...» в правом верхнем углу этого меню:

enter image description here

Затем вы можете добавить новый шаблон под названием «без негативов» со следующим кодом:

#set($paramName = $helper.getParamName($field, $project))
#if($field.modifierStatic)
static ##
#end
void set$StringUtil.capitalizeWithJavaBeanConvention($StringUtil.sanitizeJavaIdentifier($helper.getPropertyName($field, $project)))($field.type $paramName) {
  if ($paramName >= 0) {
  #if ($field.name == $paramName)
    #if (!$field.modifierStatic)
      this.##
    #else
      $classname.##
    #end
  #end
    $field.name = $paramName;
  } else {
    throw new IllegalArgumentException("$paramName must be positive");
  }
}

Обратите внимание, что этот шаблон не проверяет, можно ли сравнить тип поля с 0 или нет.

Я в основном изменил шаблон IntelliJ по умолчанию, добавив оператор if:

if ($paramName >= 0) {

и ветвь else:

  } else {
    throw new IllegalArgumentException("$paramName must be positive");
  }

Если вы просто не хотите устанавливать поле при отрицательном параметре, вместо того, чтобы генерировать исключение, просто удалите ветвь else.

...