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)
无法保持两个重要的不变量
count
永远不会返回,因为可能下溢负值.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也不例外:
private
字段,因此易于维护依赖于私有数据的不变量.null
值以多种方式潜入,因此很难保持"具有真正价值"的不变量.† - 外部性或TCB违规是系统设计者乐观地认为不会发生的事件.
通常我们只相信基本硬件在讨论构建在它们上面的高级语言的属性时就像宣传的那样工作,而不变量持有的参数不考虑以下可能性:
setAccessible
来修改private
查找表.对于某些系统,我们的TCB可能只包含系统的一部分,因此我们可能不会这样认为
但我们可能会认为
系统级别越高,其TCB通常越大,但是从TCB中获得的事物越不可靠,您的不变量就越有可能保持不变,从长远来看,您的系统将越可靠.
aab*_*b10 16
不变性意味着无论发生什么变化或者使用/转换它的人都应该坚持自己的条件.也就是说,即使在通过使用公共方法进行转换之后,类的属性总是满足或满足某些条件.因此,确保该类及其属性的该类的客户端或用户.
例如,
Usm*_*ail 10
它们是关于实例类必须是真实的事实.例如,如果一个类具有属性X且不变,则X必须大于0.据我所知,没有用于维护不变量的内置方法,必须使属性为私有,并确保getter和setter强制执行不变属性.
有一些注释可以使用反射和拦截器检查属性. http://docs.oracle.com/javaee/7/api/javax/validation/constraints/package-summary.html
归档时间: |
|
查看次数: |
61074 次 |
最近记录: |