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

时间:2011-02-06 09:29:32

标签: java annotations const

是否存在允许我将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(...)

4 个答案:

答案 0 :(得分:8)

答案 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

完全没用。它只是在学术上有吸引力,并没有帮助任何人进行真正的计划。