首页 > 解决方案 > 如何为将为该字段创建自定义设置器的字段编写自定义注释?

问题描述

我有以下课程。

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 中编写自定义注释”时,我发现我们可以为字段(为该字段分配默认值)、方法编写注释,但是对于将为该字段创建 setter 的“自定义注释”一无所获领域”。

注意:-我也研究了lombok setter,但它只生成普通的 setter,而不是我想要的自定义 setter。

标签: javaannotationsgetter-setterlombok

解决方案


如果你使用 IntelliJ IDEA,你可以为此添加一个新的 setter 模板。

将光标放在您的班级中,然后转到代码 -> 生成。在菜单中,选择“二传手”。然后点击此菜单右上角的“...”:

在此处输入图像描述

然后,您可以使用以下代码添加一个名为“nonegatives”的新模板:

#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 进行比较。

我基本上通过添加 if 语句修改了 IntelliJ 默认模板:

if ($paramName >= 0) {

和 else 分支:

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

如果只想在参数为负时不设置字段,而不是抛出异常,只需删除else分支即可。


推荐阅读