2010-03-12 2 views
10

나는 6.9 이것에 대해 경고이복사 생성자에서 다른 객체의 비공개 필드에 액세스 - 정말 문제가 있습니까? 내 자바 응용 프로그램에서

public MyClass(MyClass src) { 
    this.field1 = src.field1; 
    this.field2 = src.field2; 
    this.field3 = src.field3; 
... 
} 

이제 넷빈즈 같은 일부 복사 생성자를 가지고 있고이 코드에 어떤 문제가 있는지 궁금해?

내 문제 :

  • 원치 않는 부작용을 소개 할 수 게터를 사용. 새 객체는 더 이상 원본 사본으로 간주 될 수 없습니다.
  • getter를 사용하는 것이 좋습니다 경우 새로운 인스턴스에도 setter를 사용하는 것이 더 일관성이 없습니까?

편집 : 실제 경고 및 넷빈즈는 @SuppressWarnings("AccessingNonPublicFieldOfAnotherObject")

내 코드를 추가 제공하는 유일한 가능한 액션 "다른 개체의 private 필드의 액세스"입니다 실제로 주어진 예처럼 간단하다.

+0

Netbeans의 경고는 무엇입니까? – Timothy

+0

내 질문 업데이트 됨 –

+1

나는 그 이유에 대해서만 추측 할 수있다. 어떤 사람들은'private '은 현재의 * object * 만이 필드에 접근 할 수 있다는 것을 의미한다고 생각한다. (실제로 같은 클래스의 다른 객체도 필드에 접근 할 수있다. 어쩌면이 경고는 이것이 실제로 가능하다는 것과 사람들이 우발적으로 그것을하지 못하게한다는 것을 상기시키는 의미 일 수 있습니다. –

답변

7

코드에 아무런 문제가 없습니다. 사실, 나는 당신의 우려를 공유하고 getter를 사용하지 않는 것을 선호합니다.

경고는 정확히 무엇입니까? 어쩌면 당신이 우리에게 보여주지 않는 것과 관련이 있을까요?

업데이트 : 넷빈즈가 정말로 불만을 나타 냈습니다. 그것은 IDE와 함께 제공되는 오히려 논란의 경고입니다, 나는 생각합니다.

+4

물론입니다. private 클래스의 개념은 클래스 구현에 대한 private *입니다. 복사 생성자는 클래스 구현의 일부이며 개인 데이터로 좋아하는 것을 할 수 있습니다. –

+0

이러한 복사본은 필드가 원시적이지 않지만 내용이 변경 될 수있는 필드 인 경우 문제가됩니다. 원하는 경우에도 동시성 문제가 발생할 수 있습니다. – extraneon

+0

@extraneon : 경고 범위를 벗어나는 것 같습니다. 게터에 물건을 배치하는 것은 거기에서도 변화를주지 않을 것입니다. – Thilo

0

아마도 클래스는 복사 된 개체에서 반환 할 데이터를 알고있는 얕은 복사 메서드를 제공 할 수 있습니다. 필요한 경우 깊은 사본을 제공 할 수도 있습니다.

public MyClass shallowCopy() { 
    MyClass aCopy = new MyClass(); 
    aCopy.field1 = this.field1; 
    aCopy.field2 = this.field2; 
    aCopy.field3 = this.field3; 
} 
+0

정확히 동일한 경고를 제공합니다. –

4

NetBeans가 경고하는 이유를 모르지만 실제로는 을 얕은 복사본으로 만듭니다. 사본은 field1, field2 및 field3을 src와 공유하며 field3의 수정 사항 (예 : 목록)은 원본에 반영됩니다.

private List field1; 

public MyClass(MyClass src) { 
    this.field1 = src.field1; 
    this.field2 = src.field2; 
    this.field3 = src.field3; 

    field1.add(new Object()); // field1 of src also modified 
... 
} 
+0

좋은 점은, 나는 가변 유형을 생각하지 않았다. 하지만이 경우에는'int'와'String' 타입 만 복사하고 있습니다. –

6

그것은 토론 ADT객체 생각 나게한다.

ADT는 ADT의 다른 인스턴스의 내부 상태에 액세스 할 수 있습니다. 객체 철학은이를 방지하고 getter/setter를 통해 액세스를 시행하여 표현 독립성을 보장합니다.

그것은 자바에서 변수 인스턴스가있는 심의를 선택이었다 클래스 (개인, 후자의 경우에는 단지 this.privateInstVar이 허용되지 obj.privateInstVar) 객체 개인하지.

약점과 약점이 있습니다. 등호에 관해서는 대단히 편리합니다. 반면에 그것은 오용 될 수 있으며 은 캡슐화를 해제.

거의 철학적 논쟁 거리입니다. 그러나 IMHO, 당신이하고있는 일은 괜찮습니다.

관련 문제