不变量是否适用于无状态对象?

时间:2014-12-31 13:07:20

标签: java stateless invariants

我正在阅读关于不变量的内容,我不确定我是否完全理解它。来自Wikipedia

  

类不变量约束存储在对象中的状态

所以,如果我做对了,不变量不适用于无状态对象,因为没有约束。那是对的吗?我错了吗?我比较苹果和橘子吗?

3 个答案:

答案 0 :(得分:0)

不变量将是:

调用任何对象(myBankAccount.Balance >= 0)方法之间的

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

  1. 使用final关键字
  2. 使用断言
  3. 抛出异常
  4. 使用mutator方法
  5. 例如,参加班级年龄:

    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;。