我想创建一个注释,限制开发人员将 null 指定为参数,该参数已使用 @NoNull
进行注释例如,如果我创建此方法:
public void printLine(@NoNull String line) {
System.out.println(line);
}
在方法调用中,如果用户为行指定 null ,我想要出现错误:printLine(null);
我一直在使用APT一段时间,我想知道如何做到这一点(如果可能的话)?
这是我到目前为止创建的注释:
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.SOURCE)
public @interface NoNull {}
答案 0 :(得分:3)
编译时间很难检查,因为你真的在处理运行时值。如果你想创建注释来自动添加代码来检查这些东西,你应该看一下项目lombok:
它使用注释处理器向bean添加代码以执行各种操作。
例如:
@Getter @Setter
private int id;
注释处理器会自动将get / set方法添加到bean中。
我认为它没有空检查,但你应该可以添加它并贡献它。
另一种选择是使用验证jsr,虽然这要求您在运行时显式验证,但您可以使用代理或AOP来完成此操作。
@NotNull @Min(1)
public void setId(Integer id)
答案 1 :(得分:2)
关键是不仅仅为了可读性而使用注释,而是在编译时使用APT强制执行注释
考虑到null是一个运行时工件,我不知道你将如何在“编译时”强制执行空检查。
相反,你必须修改你的类, apt 不是这样做的工具,至少不是它本身。存在从源文件中提取有关注释元素的信息。但要强制执行@Null
限制,您需要修改正在运行的类。
您可以做的一件事是使用 apt 提取有关注释参数的信息,然后使用 aspectj 之类的工具在运行时修改这些类以检查参数值
但对于一个单独的问题,这个话题太宽泛了。
答案 2 :(得分:0)
@Nullable,@ Nonnull位于包中:javax.annotation
结账番石榴,它有一些不错的东西是类型安全: http://code.google.com/p/guava-libraries/wiki/GuavaExplained