2010-03-11 5 views
3

여기 내 첫 번째 질문은 너무 친절합니다.개인 속성을 사용하여 복사 생성자

다음 코드에 대한 인수를 싶습니다

public class Example { 
    private String name; 
    private int age; 

    ... 

    // copy constructor here 
    public Example(Example e) { 
     this.name = e.name; // accessing a private attribute of an instance 
     this.age = e.age; 
    } 

    ... 
} 

나는이 복사 생성자에 전달 된 인스턴스의 모듈화를 중단 생각합니다.

public class Example { 
    private String name; 
    private int age; 

    ... 
    // copy constructor here 
    public Example(Example e) { 
     this.setName(e.getName()); 
     this.setAge(e.getAge()); 
    } 

    ... 
} 

친구가 복사 구조에서 우리는 가능한 한 빨리 객체를 생성해야한다는,보기의 유효한 점을 노출했습니다 이 내가 올바른 생각하는 것입니다. getter/setter 메서드를 추가하면 불필요한 오버 헤드가 발생합니다.

나는 사거리에 서 있습니다. 약간의 빛을 비출 수 있습니까?

+0

첫 번째 질문에 우수합니다. – John

답변

1

액세스는 객체 기반이 아닌 클래스 기반입니다.

회원을 비공개로 설정하는 이유는 클래스가 잘 정의 된 API 외부에서 구현 세부 사항을 알지 않아서 나머지 시스템이 구현 변경을 허용 할 수 없기 때문입니다. 그러나 복사 생성자는 "시스템의 첫 번째"가 아닙니다. 이것은 사용자 자신의 클래스입니다.

+0

안녕하세요 DVK, "시스템의 첫 번째"를 의미하는 것은 무엇입니까? 나는 당신의 관점을 이해했으며, 나는 프로그래밍 교사로부터 같은 대답을 얻었다. –

+0

나머지 시스템 - 클래스 외부에있는 코드/클래스. – DVK

1

첫 번째 예제는 동일한 클래스의 봇 인스턴스이므로 인스턴스의 개인 속성을 복사하지 않습니다.

그러나 액세스 방법/속성을 추가하면 괜찮은 컴파일러는 간단한 "인라인"으로 최적화해야합니다.이 경우 두 번째 방법은 코드가 더 깨끗합니다 (모든 액세스가 액세스 함수를 통해 이루어짐)하지만 두 방법 모두 종료해야합니다 우리는 똑같이 효율적으로 (아마도 동일하게) 회원별로 복사해야합니다.

복사 생성자를 효율적으로 사용하려면 하위 수준의 이진 복사본이 구성원 별 복사본보다 빠릅니다. 그러나 상당히 더 "더러운".

일반적으로 속성/접근자를 통해 모든 멤버 필드에 액세스하는 것이 더 좋습니다. 필드를 액세스하는 코드를 변경하지 않고도 기본 구현/저장 영역을 변경할 수 있습니다. 속성/접근 자 자체.