是否存在允许我将Java方法注释为@Const的现有库,以便编译器(使用apt I presume)在更新字段时会标记错误,或者在a上调用非@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
}
现在,如果我定义一个方法,如:
void processPerson(@Const Person p)
p.getName()
中的processPerson
行就可以了,因为getName
被标记为@Const方法。但是,在p.setName()
内调用processPerson
会被标记为错误。
请注意,这与final
非常不同:如果参数定义为final Person p
,则对p
的任何分配都是非法的,但修改{{}仍然完全有效{1}}引用(使用p
或更直接地使用p.setName(...)
。
答案 0 :(得分:8)
JSR-305据说可以解决您正在寻找的问题
我个人认为我是否可以使用Hibernate Validator - Bean Validation (JSR-303)。这是一个很棒的小lib(不依赖于hibernate,它很小),它确实让你的数据保持干净。请参阅documentation。
谷歌人最近也开始Contracts for Java,但它可能还不是生产质量。
答案 1 :(得分:6)
看一下Checker Framework,它基本上有试图通过可扩展类型注释系统[JSR-308]检测软件缺陷[JSR-305]的检查器。
它有一个不变性检查器(实际上是2个),它允许您使用@Mutable,@ Immitable和@Readonly等不可变性注释来注释代码。此工具区分不可变实例和只读引用。
我喜欢这个框架并且主要用它来进行空检查,但我正在尝试更多地使用不变性检查器和实习检查器。
将参数注释为@Const,以便接受方法不能调用任何非@Const方法,或更新其任何字段?
看起来像:
void addFriend(@ReadOnly Friend friend) { this.friends.add(friend); }
允许我将Java方法注释为@Const,这样编译器(使用apt I presume)会在更新字段时标记错误,或者在字段上调用非@ Const方法;和
对于问题中的示例,它看起来像这样:
public String getName(@ReadOnly Person this) {
return name;
}
此处的@ReadOnly
表示接收方(正在调用其方法的this
实例)应 NOT 进行修改。尽管有明显的额外参数,该方法仍然照常调用:
@ReadOnly Person person = new Person();
person.getName();
答案 2 :(得分:0)
我在借助@AlexR评论,这可以使用AspectJ来完成,具体如下:
public aspect ConstAspect{
declare warning : withincode(* *(..,@Const (*),.. ) ) : "Calling Const Method..";
}
这对你的要求不正确,但我基本上想要展示一种方法。在上面的例子中,任何在参数上有@Const的方法都会被警告标记。使用更好的连接点,可以使用错误标记所有关注点。
答案 3 :(得分:-4)
const
在C ++中。 Java显然故意抛弃它。现在人们在没有经验的情况下成长const
认为这是一个好主意。
一旦你将一种方法标记为const
,它就像癌症一样蔓延,很快你就会发现自己const
几乎所有的东西。最好有not-const
。
完全没用。它只是在学术上有吸引力,并没有帮助任何人进行真正的计划。