龙目岛中的自定义`NonNull`注释

时间:2017-04-08 14:00:19

标签: java nullpointerexception null lombok

这里是NonNull注释龙目岛的java-doc:

  

如果放入参数,lombok将在开头插入一个空检查   方法/构造函数的主体,抛出一个{@code   NullPointerException},参数的名称为消息。如果穿上   一个字段,任何生成的方法都会为该字段赋值   也产生这些零检查。请注意,任何名为{@code的注释   带有任何外壳和任何包的NonNull}将导致nullcheck   为生成的方法生成(并将注释复制到   getter返回类型和生成的方法的任何参数),但是   此注释(如果存在于参数上)将产生   在null检查中插入您的其他手写方法。

     

警告:如果java社区确实决定支持单个   {@code @NonNull}注释(例如通过JSR305),然后这个   注释将从lombok包中删除。   如果需要更新import语句会让您感到害怕,那么您应该使用   你自己的注释名为{@code @NonNull}而不是这个。

拥有自己的注释的最简单方法是什么,让我们说 NonNull Nonnull,然后根据我的注释注入null-check吗?

更新:我的问题很热,有一个注释用于方法参数。

1 个答案:

答案 0 :(得分:1)

首先,您需要将其命名为nonNull(套管无关紧要)。 Lombok不会识别NotNull。此外,您需要设置另一个Lombok注释(例如@Data@Setter,...),以便您的类型由Lombok处理。

总结您的自定义注释并不像@lombok.NonNull - 注释本身那样有价值。如果您的类型不包含任何其他Lombok注释,例如:

,那么您可以从@lombok.NonNull - 注释中获益的示例中,您的自定义注释甚至无法处理。
class NoLombokAnnotationsAnywhere {
  void testMe(@lombok.NonNull String nonNull) { /* .. */ }
}
只要致电NullPointerException

就会生成new NoLombokAnnotationsAnywhere().testMe(null)。虽然这不会随你的自定义注释抛出任何东西。当然,这只适用于您没有任何其他Lombok注释的情况。一旦类型被Lombok处理,您的注释也会被处理。

如果您有自己的NonNull - 注释,那么您可以添加另一个看起来合适的Lombok注释,Lombok会为您添加一个空检查,例如:

@Data
class NonNullData {
  @mycustom.Nonnull
  String value;
}

// Calling the following throws a NullPointerException as expected
new NonNullData(null);

您可能还会发现以下问题:Support annotations named @NotNull as well as @NonNull