M. *_*ein 12 java annotations const
是否存在允许我将Java方法注释为@Const的现有库,以便编译器(使用apt I presume)在更新字段时标记错误,或在字段上调用非@ Const方法; 并将参数注释为@Const,以便接受方法不能调用其任何非@Const方法,或更新其任何字段?
(基本上,尝试使用注释向Java添加const-correctness;上面的问题中没有涉及一些明显的细节,例如分配给@ Const-typed参数等等)
我发现了这个:http://confluence.atlassian.com/pages/viewpage.action?pageId = 182158080,但它似乎只作为IDEA的一部分提供.
根据下面的澄清请求,这里的示例代码显示我的意思:
class Person {
private String name;
private String address;
@Const public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
... etc. for address
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我定义一个方法,例如:
void processPerson(@Const Person p)
Run Code Online (Sandbox Code Playgroud)
的线,例如:p.getName()将是OK processPerson,由于getName被标记为@const方法.但是p.setName()从内部调用processPerson会被标记为错误.
请注意,这与以下内容非常不同final:如果参数被定义为final Person p,则任何赋值p都是非法的,但修改p引用的内容仍然完全有效(使用p.setName(...)或者更直接地使用p.name = ....
据说JSR-305可以满足您的需求
就个人而言,我会看看我是否可以使用Hibernate Validator - Bean Validation(JSR-303).这是一个很棒的小lib(不依赖于hibernate,它很小),它确实能让你的数据保持干净.请参阅文档.
一个谷歌人最近也开始使用Contracts for Java,但它可能还不是生产质量.
看看Checker Framework,它基本上有试图通过可扩展类型注释系统[JSR-308]检测软件缺陷[JSR-305] 的检查器.
它有一个不变性检查器(实际上是2个),允许您使用@Mutable,@ Immitable和@Readonly等不可变注释来注释代码.此工具区分不可变实例和只读引用.
我喜欢这个框架,并主要用它来进行空检查,但我试图开始使用不变性检查器和实习检查器.
将参数注释为@Const,以便接受方法不能调用其任何非@Const方法,或更新其任何字段?
看起来像:
void addFriend(@ReadOnly Friend friend) { this.friends.add(friend); }
Run Code Online (Sandbox Code Playgroud)
允许我将Java方法注释为@Const,这样编译器(使用apt I presume)会在更新字段时标记错误,或者在字段上调用非@ Const方法; 和
对于问题中的示例,它看起来像这样:
public String getName(@ReadOnly Person this) {
return name;
}
Run Code Online (Sandbox Code Playgroud)
在@ReadOnly这里表示接收方(this应其方法被称为实例)不被修改.尽管有明显的额外参数,仍然像往常一样调用该方法:
@ReadOnly Person person = new Person();
person.getName();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2669 次 |
| 最近记录: |