我有一个非常简单的类作为下面的例子:
public class Demo {
private int val;
public int getVal() {
return val;
}
public void setVal(@IntRange(from = 1, to = 10) int v) {
val = v;
}
}
在这里,我使用 IntRange
在 val 上强制执行一个范围。当我创建一个新对象并尝试在我的代码中设置一个超出范围的值时,这很好用。例如:
Demo d = new Demo();
d.setVal(500); //android studio highlights this as lint-warning
但是,我想在编译 和运行时 强制执行此范围验证,并希望在值不在范围内时抛出错误。
我怎样才能做到这一点?
附言我知道我可以在更新我的变量之前在 setVal
方法中检查范围,但这不是我要处理的,我希望通过 android 的注释库找到解决方案。
最佳答案
要在编译时为发布版本强制执行此注释,请将具有以下内容的lint.xml文件添加到模块的根目录
<lint>
<issue id="Range" severity="fatal"/>
</lint>
通过这样做,您可以覆盖“Range”lint 警告的严重性,如果出现此警告,发布构建将失败
也许可以实现在运行时强制执行此注释的机制(例如使用自定义注释处理器),但这要复杂得多并且不值得付出努力
通过注解处理的实现可能是这样的:
带有@IntRange
注解的初始类
public class Demo {
private int val;
public int getVal() {
return val;
}
public void setVal(@IntRange(from = 1, to = 10) int v) {
val = v;
}
}
您可以实现注释处理器以从您的初始Demo
类生成以下类
(编译时生成)
public class DemoWithChecks extends Demo {
public void setVal(int v) {
if (v >= 1 && v <= 10) {
super.setVal(v)
} else {
//value out of range - throw exception or whatever
}
}
}
然后您可以在代码中使用 DemoWithChecks
而不是 Demo
以在运行时强制执行注释检查。
附言关于编写自己的注释处理器的好文章 here
关于android - 在编译/运行时强制执行 android 注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52870881/