什么是java中的类不变量?

Sau*_*mar 88 java terminology invariants

我搜索了这个主题,但除了维基百科之外,我没有找到任何进一步有用的文档或文章.

任何人都可以用简单的语言向我解释它的含义或者向我推荐一些简单易懂的文档吗?

Mik*_*uel 82

它并没有特别指代java中的任何内容.

类invariant只是一个属性,它始终保存类的所有实例,无论其他代码是什么.

例如,

class X {
  final Y y = new Y();
}
Run Code Online (Sandbox Code Playgroud)

X具有类不变量,即有一个y属性,它永远不会,null并且它具有类型的值Y.

class Counter {
  private int x;

  public int count() { return x++; }
}
Run Code Online (Sandbox Code Playgroud)

无法保持两个重要的不变量

  1. count永远不会返回,因为可能下溢负值.
  2. 这种要求count严格单调增加.

修改后的类保留了这两个不变量.

class Counter {
  private int x;

  public synchronized int count() {
    if (x == Integer.MAX_VALUE) { throw new IllegalStateException(); }
    return x++;
  }
}
Run Code Online (Sandbox Code Playgroud)

但是无法保留调用count始终正常成功的不变量(没有TCB违规),因为count可能会抛出异常,或者如果死锁线程拥有计数器的监视器,它可能会阻塞.

每个使用类的语言都可以轻松维护某些类不变量,而不是其他类.Java也不例外:

  1. Java类始终具有或不具有属性和方法,因此界面不变量易于维护.
  2. Java类可以保护它们的private字段,因此易于维护依赖于私有数据的不变量.
  3. Java类可以是最终的,因此可以维护依赖于通过制作恶意子类而不存在违反不变量的代码的不变量.
  4. Java允许null值以多种方式潜入,因此很难保持"具有真正价值"的不变量.
  5. Java具有线程,这意味着不同步的类在维护依赖于一起发生的线程中的顺序操作的不变量时会遇到问题.
  6. Java有一些例外,可以很容易地维护不变量,例如"返回带有属性p的结果或不返回结果",但更难维护不变量,如"始终返回结果".

† - 外部性TCB违规是系统设计者乐观地认为不会发生的事件.

通常我们只相信基本硬件在讨论构建在它们上面的高级语言的属性时就像宣传的那样工作,而不变量持有的参数不考虑以下可能性:

  • 程序员使用调试挂钩来改变局部变量,因为程序以代码不能运行的方式运行.
  • 您的对等方不使用反射setAccessible来修改private查找表.
  • Loki改变了物理,导致处理器错误地比较两个数字.

对于某些系统,我们的TCB可能只包含系统的一部分,因此我们可能不会这样认为

  • 管理员或特权守护程序不会终止我们的JVM进程,

但我们可能会认为

  • 我们可以检查点到一个可靠的事务文件系统.

系统级别越高,其TCB通常越大,但是从TCB中获得的事物越不可靠,您的不变量就越有可能保持不变,从长远来看,您的系统将越可靠.

  • “那个`count` 永远不会返回相同的值两次”真的被认为是一个类不变量吗? (2认同)

aab*_*b10 16

不变性意味着无论发生什么变化或者使用/转换它的人都应该坚持自己的条件.也就是说,即使在通过使用公共方法进行转换之后,类的属性总是满足或满足某些条件.因此,确保该类及其属性的该类的客户端或用户.

例如,

  1. 函数参数的条件是,它应该始终> 0(大于零)或不应为null.
  2. account类的minimum_account_balance属性表示,它不能低于100.因此所有公共函数都应该遵守这个条件并确保类不变.
  3. 基于规则的变量之间的依赖关系,即一个变量的值取决于另一个变量,所以如果一个变量,使用一些fix-rule,其他变量也必须改变.必须保留2个变量之间的关系.如果没有,则违反不变量.


Usm*_*ail 10

它们是关于实例类必须是真实的事实.例如,如果一个类具有属性X且不变,则X必须大于0.据我所知,没有用于维护不变量的内置方法,必须使属性为私有,并确保getter和setter强制执行不变属性.

有一些注释可以使用反射和拦截器检查属性. http://docs.oracle.com/javaee/7/api/javax/validation/constraints/package-summary.html