假设一个客户端有一个类的对象,这个类已经改变为新的状态。如果那个类调用以前的状态,会发生什么?
例子:
我写了一个类如下
Class Old{
int a;
}
假设我创建了 Old 类的新对象。我也序列化了这个对象。然后,我按如下方式更改旧类:
Class Old{
int a;
int b;
}
如果我尝试用新的旧类反序列化对象会发生什么?
最佳答案
由于客户端持有对象的引用,因此它将始终访问当前对象及其当前状态。类的实例在变得陈旧或无效的意义上不是有状态的。
在一个地方对一个类的实例所做的更改将被所有引用该实例的类访问。
这个例子说明了上面的观点,因为类 State,B,C
都包含一个 A
的实例,它指向内存中的同一个位置,又名:引用
。当类 B
更改 A
的状态时,将对类 State,B,C
引用的内存中的实例进行更改。
不要认为 C
更改了 A
,所以现在 A
的所有实例都已更新。更像是现在每个人都指向更新的对象。
这是一个非常简单的现实生活示例。假设我允许我所有的 friend 编辑我的 LinkedIn 个人资料。将我的 LinkedIn 个人资料视为“A”。当我所有的 friend 查看我的个人资料 (A) 时,他们看到我的头衔是 Web 应用程序开发人员。现在,如果我的一个 friend (B) 访问我的个人资料并将我的头衔更改为 Hobo (field),我的所有 friend (A、B、C) 都会看到新头衔。为什么我的其他 friend (State,C) 看不到“Web 应用程序开发人员”作为我的头衔(字段)?这是因为我的个人资料 (A) 有一个实例,并且同一个人资料被有权访问它的任何人查看或更新。
public class State {
public static void main(String[] args) {
A a = new A();
B b = new B(a);
C c = new C(a);
System.out.println(a.field); //0
System.out.println(b.a.field); //0
System.out.println(c.a.field); //0
b.change();
System.out.println(a.field); //3
System.out.println(b.a.field); //3
System.out.println(c.a.field); //3
}
}
class A{
public Integer field = 0;
}
class B{
public A a;
public B(A a){
this.a = a;
}
public void change(){
this.a.field = 3;
}
}
class C{
public A a;
public C(A a){
this.a = a;
}
}
关于java - 如果对象调用先前状态的类函数会发生什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17209656/