如何创建注释以防止某些值?

时间:2016-02-16 07:44:39

标签: java annotations

我想在java中创建一个注释,以防止在方法中插入一些值?例如:

public void getInfo(@AnnotationName int position){
}

所以,最后,"位置"将得到e.x 40 - 50之间的值。

3 个答案:

答案 0 :(得分:1)

有两种通用方法可以防止方法使用某些形式参数值执行。

  • 进行运行时检查。在运行时,当调用该方法时,如果参数值是非法的,则某些代码会运行并抛出异常。这不会阻止非法调用,并且您的代码将在运行时崩溃,但它确实阻止了在使用非法参数调用时执行该方法。您可以使用断言,通过bean validation等明确地抛出异常来实现此目的。

  • 进行编译时检查。在编译时,如果使用可能非法的值调用方法,编译器将发出警告。这确实可以防止非法调用,也不需要运行时检查,也不需要运行时崩溃。要实现这一点,您需要创建一个作为javac插件运行的annotation processor。 存在框架以便于创建编译时注释处理器,以确保合法地调用方法。一个例子是Checker Framework

答案 1 :(得分:0)

注释只是一个声明。使用关键字@interface声明注释并不是一种可能性。

您可以使用注释定义规则。但是有人必须实现代码并且必须执行此代码。

所以,你有几个解决方案。

(1)你可以自己实现所有这些而不需要注释:

public void getInfo(int position){
    if(postion < 40  || position > 50) {
        throw new IllegalArgumentException("Wrong position")l
    }
}

丑陋,但有效。

(2)例如,如果您有接口及其多个实现,则可以使用Wrapper(或Decorator)模式并实现自己的包装器,仅执行验证:

public interface InformationProvider {
    public void getInfo(int position);
}

public class InformationProviderImpl implements InformationProvider {
    public void getInfo(int position) {
         // your implementation
    }
}



public class InformationProviderValidator implements InformationProvider {
    private final InformationProvider provider;
    private final int min;
    private final int max;
    public InformationProviderValidator(InformationProvider provider, int min, int max) {
        this.provider = provider;
        this.min = min;
        this.max = max;
    }
    public void getInfo(int position) {
        if(postion < min  || position > max) {
            throw new IllegalArgumentException("Wrong position")l
        }
        return provider.getInfo(position);
    }
}

(3)方法#2可以改进。你确实可以定义注释,例如

public @interface Min {
    int value();
}
public @interface Max {
    int value();
}

现在InformationProviderValidator可以发现提供者provider的类,并从注释中提取最小值和最大值。

(4)从这个解决方案到面向方面的编程只是一步。例如,您可以使用AspectJ。

(5)类似的解决方案是使用验证框架。 Java定义了标准注释(参见http://docs.oracle.com/javaee/6/tutorial/doc/gircz.html)。 (JSR 303)。据我所知,这个标准有2个实现:    - http://bval.apache.org/    - http://hibernate.org/validator/

答案 2 :(得分:-1)

尝试bean验证:http://beanvalidation.org/ 有许多注释有助于验证bean的输入