如果使用generics?
,可以检查一类在编译时间中包含特定注释吗?我正在创建一个包装类别,这将是对各种HTTP调用的响应。
我想要的是该包装类别,以使用户可以通过我自己注释注释的任何类型的对象传递。
例如,我的包装类可以如下:
public class HTTPResponse<T> {
private HttpStatus status;
private int statusCode;
private T data;
public HTTPResponse(HttpStatus status, T data) {
this.status = status;
this.statusCode = status.value();
this.data = data;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
//other getters/setters
}
使用此类时,我可以创建一个新的httpresponse对象并声明"数据"字段的类型:
HTTPResponse<SomePOJO> response = new HTTPResponse<>(HttpStatus.OK, new SomePOJO());
这个想法是,任何试图使用此课程的人都可以在施工期间通过自己的自定义Pojo传递。但是,我希望能够检查在构造过程中通过我创建的自定义接口注释的对象。
例如,我的SomePojo类需要看起来像下面:
@MyCustomInterface
public class SomePOJO() {
//code stuff here
}
有没有办法检查在编译时间内用@MyCustomInterface注释SomePoJo类的方法吗?
我知道我可以标记我的注释,以便在运行时可用,然后在httpresponse类的构造函数中执行检查。但是,我真的很想让我的班级用户尽快知道(在编译时间内)他们尚未用正确的接口标记自己的pojo,因此在创建httpresponse对象之前需要做到这一点。
在这种情况下,注释甚至是正确的方法吗?是否无法以某种方式检查在编译时间期间100%检查类注释,我应该强迫用户实现我的自定义界面,然后指定
HTTPResponse with public class HttpResponse<T implements MyCustomInterface> {
//fields, getters, setters
}
感谢您的阅读,如果您设法使它变得如此远!
上面的自定义注释的目的只是将类标记为可以在httpresponse类中使用的项目。困难的部分是在编译时间期间对此进行验证。
此问题的简单答案是使用标记接口!
在约书亚·布洛赫(Joshua Bloch)的有效爪哇(Java)中,他写道:
标记接口比标记注释具有两个优点。第一的 最重要的是,标记接口定义了由 标记级别的实例;标记注释没有。这 这种类型的存在使您可以在编译时间捕获错误 如果使用标记注释,您才能捕获直到运行时。
因此,我上面提出的问题是无效的。如果您想在编译时捕获错误,则不应使用标记注释。将自定义注释更改为接口后,我指定了有限的通用类,如下所示:
HTTPResponse with public class HttpResponse<T implements MyCustomInterface> {
//fields, getters, setters
}