2009-04-25 4 views
4

최근에 자바로 이동했지만 변수 별칭 문제가 발생했습니다. 모든 곳을 검색했지만 동일한 객체를 참조하지 않고 한 객체의 내용을 다른 객체에 복사하는 적절한 방법을 찾지 못하는 것 같습니다. 누구든지 어떤 제안이 있습니까?Java 변수 앨리어싱 해결 방법

편집 : 앨리어싱에 문제가있는 int 인 경우 어떻게해야합니까? 내가 이런 상황을 처음부터 피할 수 있을까요? 그렇다면 어떻게?

+0

코드에 의미있는 내용의 두 줄 또는 두 줄을 게시 할 수 있습니까? 나는 "같은 객체를 참조하지 않고 한 객체의 내용을 다른 객체에 복사"하는 것으로 100 % 확신 할 수는 없습니다. – Joe

+0

용어 별칭을 사용하는 언어는 무엇입니까? 별칭과 동일한 객체에 대한 두 개의 참조가 있다고 생각합니다. 그러나 오브젝트의 딥 클론은 완전히 새로운 오브젝트를 제공하는데, 실제로는 첫 번째 오브젝트를 참조하지 않으므로 별명은 무엇입니까? –

답변

10

클래스가 Clonable 인터페이스를 구현하는 경우 Object.clone() 메서드를 사용하여 하드 카피를 만들 수 있습니다. Wikipedia 항목에는 좋은 세부 정보가 있습니다.

대안은 this page에 따라 더 안전한 copy constructors을 사용하는 것입니다.

+1

mihi의 답변과 마찬가지로 유용하지만이 유용한 링크가 모두 마음에 들었습니다. 링크를 통해 필요한 경우 더 많은 정보를 찾을 수 있습니다. 어쨌든, 나는 어떤 종류의 복사 생성자를 구현했다. –

+2

복제물은 매우 위험합니다. "비트 단위"복사본을 만듭니다. 이는 거의 당신이 원하는 것이 아닙니다. 어느 정도는 수정 코드를 삽입 할 수는 있지만 때때로 조용히 엉망으로 만들 수 있습니다. 상속으로도 잘 돌아 가지 않습니다. –

1

java.lang.Cloneable은 사용자가 찾고있는 것입니다.

4

"내용"에 따라 다릅니다. 예를 들어 FileInputStream을 복사 한 다음 두 파일이 같은 파일에서 계속로드된다고 가정 할 수는 없습니다.

기본적으로 두 가지 방법이 있습니다. 클래스에서 "Cloneable"인터페이스를 지원하는 경우 clone()을 호출하여 복제 할 수 있습니다. 그렇지 않은 경우에는 종종 다른 객체의 데이터를 복사하는 복사 생성자가 있습니다.

일반적으로 얕은 사본으로 끝납니다 (즉, 클래스의 모든 필드는 복사되지만 동일한 객체를 가리 킵니다).

한편, 많은 개체는 String 클래스와 같이 변경할 수 없도록 디자인되어 있으므로 어쨌든 변경할 수없는 개체를 복사 할 필요가 없습니다.

+0

FileInputStream을 서브 클래스 화하고 Cloneable을 구현할 수 있다고 생각합니다. 클론은 잘 작동합니다. 아마도 조금 이상하지만, 실제로는 두 개의 스트림 객체를 동일한 FileDescriptor에 제공 할 것입니다 (소스를 최근에 확인하지 않음). –

1

Java에서 참조에 대한 암시 적 참조를 가질 수 없으므로 변수의 별명을 지정할 수 없습니다. 당신은 정말 당신이 int 값을 앨리어싱 무슨 뜻인지 설명 할 필요가 : 당신은 당신이 달성하려고하는 무엇인지 설명하는 경우

아마도, 우리는 "별명"

편집없이 그렇게 할 수 있습니다. int 값은 런타임에 익명이므로 별칭을 지정하는 것은 의미가 없습니다.

2

또 다른 옵션은 불변의 객체를 생성하는 클래스를 설계하는 것입니다 :가 생성되면 객체가 변경 될 수 없기 때문에
http://docs.oracle.com/javase/tutorial/essential/concurrency/immutable.html

이것은 복제 또는 복사 생성자의 필요성을 방지 할 수 있습니다. 따라서 여러 변수가 동일한 객체를 가리킬 수 있지만 객체의 상태를 변경할 수있는 변수는 없습니다.