【发布时间】:2011-02-06 09:29:32
【问题描述】:
是否存在允许我将 Java 方法注释为 @Const 的现有库,以便编译器(我假设使用 apt)在更新字段或调用非 @Const 方法时标记错误场地;并将参数注释为@Const,以便接受方法不能调用其任何非@Const 方法,或更新其任何字段?
(基本上,尝试使用注释向 Java 添加 const 正确性;上面的问题中没有涉及一些明显的细节,例如分配给/来自 @Const 类型的参数等)
我找到了这个: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 方法。但是从processPerson 中调用p.setName() 会被标记为错误。
请注意,这与final 有很大不同:如果参数被定义为final Person p,任何对p 的赋值都是非法的,但是修改p 所指的内容仍然是完全有效的(或者使用p.setName(...) 或者更直接地使用p.name = ...。
【问题讨论】:
-
您是否尝试为此目的使用
final关键字?它有什么问题? -
最终方法是不能被覆盖的方法。那是不同的。
-
最后一个参数意味着方法不能重新分配引用;但它仍然可以修改参数引用的对象。这(a)不是我想要的,(b)完全没用(至少在我看来)。
-
@M,它并不是完全没用,但如果你写一些示例代码,也许会更容易理解你的意思?
-
是的,你是对的。你真的可以在内部修改对象。我个人对此类任务使用无框架解决方案:如果它是集合,我使用
Collection.unmodifireableList()等包装它,如果它是我自己的类,我要么实现不允许在类本身中修改的逻辑,要么更好地使用方面包装对象。方面可以使用方面框架之一(如 AspectJ)或使用动态代理来实现。我理解您希望拥有能够自动执行此操作的框架,并祝您好运。
标签: java annotations constants