使用Annotations在Java中使用const正确性?

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 = ....

Geo*_*met 8


Ber*_*t F 6

看看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)