2013-06-20 1 views
1

클라이언트에 클래스 개체가 있고이 클래스가 새 상태로 변경되었다고 가정 해 봅시다. 해당 클래스가 이전 주를 호출하면 어떻게됩니까?개체가 이전 상태의 클래스 함수를 호출하면 어떻게됩니까

예 : 클래스 오래 된

Class Old{ 
int a; 
} 

한다고 가정 내가 만든 새로운 객체를 다음과 같이

나는 하나 개의 클래스를 작성했습니다. 나는이 객체도 직렬화했다. 그런 다음 Old 클래스를 다음과 같이 변경합니다.

Class Old{ 
int a; 
int b; 
} 

새 올드 클래스로 개체의 병어를 제거하려고하면 어떻게됩니까?

답변

3

클라이언트가 개체에 대한 참조를 보유하고 있으므로 클라이언트는 항상 현재 개체와 현재 상태에 액세스합니다. 클래스의 인스턴스는 낡거나 유효하지 않다는 점에서 상태가 아닙니다.

한 곳에서 클래스의 인스턴스를 변경하면 해당 인스턴스를 참조하는 모든 클래스에서 액세스 할 수 있습니다.

이 예제는 클래스 State,B,C에 모두 A의 인스턴스가 포함되어 있으므로 메모리에서 동일한 지점 인 aka: reference을 포함하므로 위에서 만든 점을 보여줍니다. B 클래스가 A 상태를 변경하면 State,B,C 클래스가 참조하는 메모리의 인스턴스가 변경됩니다.

변경된 A이 이제 A 인 모든 인스턴스가 업데이트됩니다. C이 변경된 것으로 생각하지 마십시오. 모든 사람들이 업데이트 된 객체를 가리키는 것처럼 생각하면됩니다.

정말 간단한 실제 예입니다. 내 모든 친구에게 내 LinkedIn 프로필을 편집 할 수있는 권한을 부여합니다. 내 LinkedIn 프로필을 'A'로 간주하십시오. 모든 친구들이 내 프로필 (A)을 볼 때 내 제목을 웹 응용 프로그램 개발자로 봅니다. 이제 내 친구 중 한 명이 내 프로필에 액세스하여 호보 (필드)로 내 제목을 변경하면 모든 친구 (A, B, C)가 새 제목을 보게됩니다. 왜 내 다른 친구들 (주, C)은 "웹 응용 프로그램 개발자"를 내 제목 (필드)으로 보지 않습니까? 왜냐하면 내 프로필 (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; 
    } 
} 
+0

이전 인스턴스가 새 클래스로 직렬화되고 비 직렬화되면 어떻게됩니까? –

0

Kevin이 언급했듯이 "클라이언트는 개체에 대한 참조를 보유하고 있으므로 항상 현재 개체와 현재 상태에 액세스합니다."

그러나 RMI와 직렬화를 사용하는 경우 클래스와 직렬화 된 바이트간에 버전이 일치하지 않으면 deserilization 문제가 발생할 수 있습니다. 비 직렬화하려는 바이트가 로컬 클래스 버전과 일치하는지 Java가 인식합니다. 그렇지 않은 경우는 예외가 슬로우됩니다. SerialVersionId는 직렬화에 사용되는 클래스의 고유 식별자입니다.

관련 문제