Java 不变量是否适用于无状态对象?
我正在读关于不变量的书,我不确定我是否完全理解了它。从 类不变量约束存储在对象中的状态Java 不变量是否适用于无状态对象?,java,stateless,invariants,Java,Stateless,Invariants,我正在读关于不变量的书,我不确定我是否完全理解了它。从 类不变量约束存储在对象中的状态 所以,如果我没弄错的话,不变量不适用于无状态对象,因为没有约束。对吗?我错了吗?我是在比较苹果和桔子吗?不变量是这样的: myBankAccount.Balance>=0在调用对象的任何(myBankAccount)方法之间。Balance变量是myBankAccount对象的成员 如果我们有一个无状态对象,即一个没有与之关联的任何数据成员的对象,那么我们就不能真正定义一个不变量(我们将如何定义它?)。无状态
所以,如果我没弄错的话,不变量不适用于无状态对象,因为没有约束。对吗?我错了吗?我是在比较苹果和桔子吗?不变量是这样的:
myBankAccount.Balance>=0
在调用对象的任何(myBankAccount
)方法之间。Balance
变量是myBankAccount
对象的成员
如果我们有一个无状态对象,即一个没有与之关联的任何数据成员的对象,那么我们就不能真正定义一个不变量(我们将如何定义它?)。无状态对象没有任何状态。以没有任何字段或具有常量字段的say实用程序类为例,如下所示:
public class MyClass {
public static final int number = 1;
private final int count = 1;
}
这意味着无论线程的“n”个数是多少,数量/计数都不会改变,并且将保持一致
而如果我接受一个带有say private字段的类,并被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范围,并且默认为负数吗?所以在这里,当发生溢出时,我们无法保持整数的不变量。无状态类没有实例成员,因此没有保持有效的状态 来自维基百科: 在计算机科学中,不变量是一个可以依赖的条件 在程序执行过程中,或在某一部分过程中 当然 在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);
}
}
公共课年龄{
私人最终年龄;
公共年龄(国际年龄){
//使用异常。。。
if(年龄<1岁){
抛出新的IllegalArgumentException(“年龄不能小于1”);
}
//或者使用断言。。。
年龄>0岁;
这个。年龄=年龄;
}
//方法也可以是不变量,因为它确保
//成员变量不能设置为无效状态。
公共年龄变更(国际年龄){
年龄>1岁;
回归新时代(时代);
}
}
因此,final关键字是一个编译器时不变的,因为它确保变量不会被重新分配。构造函数中的异常和断言是运行时不变量,因为它们约束年龄并确保年龄大于0。public方法也是一个不变量,因为它断言其参数是否无效
有些语言有不变量的概念。在你链接到的维基百科页面上,他们列出了D和埃菲尔作为例子。这意味着,您可以在一个位置定义约束(不变量),而不是引发异常、断言和检查条件,并且语言支持确保实例变量保持在您设置的约束内。在java中,您必须“手动”执行此操作。无状态对象只有编译时常量字段-因此,不可能有任何不变量。但是,它的方法可以有不变量。直观地说,没有。如果没有状态,则无法将不变量应用于类。当没有可执行条件的状态时,可以生成哪些不变量?为什么要关注多线程?我不认为不变量对多个线程特别重要,是吗?不,你是对的。但只要说,即使在调用incrNumber方法时,也不能保证它会溢出并返回到负数。