我正在阅读关于不变量的内容,我不确定我是否完全理解它。来自Wikipedia,
类不变量约束存储在对象中的状态。
所以,如果我做对了,不变量不适用于无状态对象,因为没有约束。那是对的吗?我错了吗?我比较苹果和橘子吗?
答案 0 :(得分:0)
不变量将是:
调用任何对象(myBankAccount.Balance >= 0
)方法之间的 mybankAccount
。 Balance
变量是myBankAccount
对象的成员。
如果我们有一个无状态对象,即一个没有任何与之关联的数据成员的对象,那么我们就不能真正定义一个不变量(我们将它定义在哪个?)。
答案 1 :(得分:0)
无状态对象没有任何状态。举例说明没有任何字段或具有如下所示的常量字段的实用程序类:
public class MyClass {
public static final int number = 1;
private final int count = 1;
}
这意味着数量/数量不会改变,并且无论是否由“' n”引用都将保持一致。线程数。
虽然如果我参加一个说私人领域的课程,并且正在说由setter / getter访问,那么它将如下所示:
public class MyInvariantClass {
private int number;
public int getNumber() {
return number;
}
public void incrNumber() {
this.number++;
}
public void setNumber() {
this.number = number;
}
}
此类MyInvariantClass具有带数字字段的状态。想想这个对象被传递给多个线程。有些人可能会增加它,有些人可能会设置它。它是否保证我们使用的数字永远不会超出int范围,并且默认为负数?所以这里我们无法在发生溢出时保持整数的不变性。
答案 2 :(得分:0)
无状态类没有实例成员,因此没有状态可以保持有效。
来自维基百科:
在计算机科学中,不变量是一种可以依赖的条件 在执行程序期间或在某些部分期间是真实的 它的。
在java中,可以通过几种方式将这些条件(不变量)编程到代码中。以下是一些:
例如,参加班级年龄:
public class Age {
private final int age;
public Age(int age) {
// Use exceptions...
if (age < 1) {
throw new IllegalArgumentException("Age cannot be less than 1");
}
// Or use assertions...
assert age > 0;
this.age = age;
}
// A method can be a invariant as well, because it makes sure
// member variables cannot be set to an invalid state.
public Age changeAge(int age) {
assert age > 1;
return new Age(age);
}
}
因此,final关键字是编译器时间不变量,因为它确保不重新分配变量。构造函数中的异常和断言是运行时不变量,因为它们约束年龄并确保年龄大于0.公共方法也是一个不变量,因为它断言它的参数是无效的。
有些语言内置了不变量的概念。在您链接的维基百科页面上,他们列出了D和Eiffel作为示例。这意味着不是提出异常,断言和检查条件,而是可以在一个地方定义约束(不变量),并且语言支持确保实例变量保持在您设置的约束内。在java中,您必须手动&#39;。