Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 不变量是否适用于无状态对象?_Java_Stateless_Invariants - Fatal编程技术网

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中,可以通过几种方式将这些条件(不变量)编程到代码中。以下是一些:

  • 使用final关键字
  • 使用资产
  • 抛出异常
  • 使用变异方法
  • 例如,以班级年龄为例:

    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方法时,也不能保证它会溢出并返回到负数。