0

我想创建一个注释,限制开发人员将null指定为参数,该参数已使用@NoNull进行注释

例如,如果我创建此方法:

public void printLine(@NoNull String line) {
    System.out.println(line);
}

在方法调用中,如果用户为line指定null,我希望出现错误:printLine(null);

我使用 APT 只用了一点时间,我想知道如何做到这一点(如果可能的话)?

这是我到目前为止创建的注释:

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.SOURCE)
public @interface NoNull {}
4

3 回答 3

3

编译时间将很难检查,因为您实际上是在处理运行时值。如果你想创建注释来自动添加代码来检查这些东西,你应该看看项目 lombok:

http://projectlombok.org/

它使用注释处理器将代码添加到您的 bean 中以执行各种操作。

例如:

@Getter @Setter
private int id;

注释处理器会自动将 get/set 方法添加到您的 bean。

我不认为它有空检查,但你应该能够添加它并贡献它。

另一种选择是使用验证 jsr,尽管这需要您在运行时显式验证,但您可以使用代理或 AOP 来完成此操作。

@NotNull @Min(1)
public void setId(Integer id)
于 2012-09-04T21:43:43.083 回答
2

重点不是仅仅为了可读性而使用注释,而是在编译时使用 APT 强制执行注释

考虑到 null 是运行时工件,我看不出您将如何在“编译时”强制执行 null 检查。

相反,您必须修改您的类,而apt不是执行此操作的工具,至少本身不是。它的存在是为了从源文件中提取有关注释元素的信息。但是要强制执行您的@Null限制,您需要修改运行类。

您可以做的一件事是使用apt提取有关注释参数的信息,然后使用aspectj之类的工具在运行时修改这些类以检查参数值。

但对于单个 SO 问题来说,这个话题太宽泛了。

于 2012-09-04T21:30:46.587 回答
0

@Nullable、@Nonnull 位于包中:javax.annotation

结帐番石榴,它有一些不错的东西是类型安全: http ://code.google.com/p/guava-libraries/wiki/GuavaExplained

于 2012-09-04T21:16:51.273 回答