【问题标题】:How to write custom annotation for field which will create custom setter for that field?如何为将为该字段创建自定义设置器的字段编写自定义注释?
【发布时间】:2019-09-15 14:13:18
【问题描述】:

我有以下课程。

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,但它只生成普通的 setter,而不是我想要的自定义 setter。

【问题讨论】:

    标签: java annotations getter-setter lombok


    【解决方案1】:

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

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

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

    #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 {
        throw new IllegalArgumentException("$paramName must be positive");
      }
    

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

    【讨论】:

    • 谢谢,但我正在寻找创建注释,这样我就不必编写 setter 了(就像我们使用 lombok 时,我们不必编写 setter,它会生成所有在编译时),有可能吗?如果是,那怎么办?
    • 如果我找不到我要找的东西,那么我一定会使用它。
    • @yajiv 我看了一下 lombok ,它似乎没有为你的 setter 提供太多的自定义。您必须找到更强大的工具,或者只使用 IntelliJ 模板。
    • 好的,谢谢。我也在寻找是否可以找到,否则我将使用 IntelliJ 模板
    • 这比编写自定义注释和编译时注释处理器要容易得多,后者必须对您的类进行编码。
    猜你喜欢
    • 2021-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多