2009-01-02 4 views
2

최근에 저는 Java에서 작업하기 시작했으며 모든 게터 및 설정자의 거칠고 미친 세상에 소개되었습니다. 나는 처음에는 그것을 싫어했지만 빨리 익숙해졌다. 너무 익숙해.엔티티 개체 데이터 속성에 대한 getter 및 setter

저는 최근 수업 설계에 대해 더 많은 시간을 할애했습니다. 내가하려는 일 중 하나는 모든 것에 게 게터와 세터를하는 함정을 피하는 것입니다. 그러나 내가하는 대부분의 작업은 주로 데이터 컨테이너 인 엔터티를 사용하는 것이므로 getter 및 setter가 실제로 이러한 경우에 부적절하다는 것을 확신하지는 못합니다.

다음은 공용 속성을 사용하는 간단한 예입니다.

class Space { 
    public String name; 
    public String description; 
    Space(final String name, final String description) { 
     this.name = name; 
     this.description = description; 
    } 
} 

다음은 개인 속성을 사용하고 getter 및 setters를 사용하는 간단한 예입니다. 이러한 예에서

class Space { 
    private String name; 
    private String description; 
    Space(final String name, final String description) { 
     this.name = name; 
     this.description = description; 
    } 
    public String getName() { 
     return this.name; 
    } 
    public void setName(final String name) { 
     this.name = name; 
    } 
    public String getDescription() { 
     return this.description; 
    } 
    public void setDescription(final String description) { 
     this.description = description; 
    } 
} 

, 모두 namedescription 필드는 할 수 있어야 변경할 수 있습니다.

getter/setter 예제가 더 명확하고 구현 세부 사항이 namedescription 인 것을 숨 깁니다. 나중에 필요한 경우 유효성 검사를 설정할 수도 있습니다.

게터와 세터가 악의적이거나 반 패턴이되는 것에 대한 토론을 여러 번 읽었지만이 상황에 적용되지 않을 수도 있습니다.

아마도 아직 고려하지 않은 몇 가지 옵션이있을 수 있습니다. 나는 제안을 위해 열려있다!

답변

3

하는 것은 간단 넣으려면 :

  • 당신은 외부에서 읽을 수 있어야합니다 모든 필드에 대한 게터가 필요합니다.
  • 외부에서 작성해야하는 모든 입력란에는 설정자가 필요합니다.

이 값은 100 % 일 수 있지만 대부분은 적습니다.

+0

내가 이것을 인정한다는이되었을 수 있습니다 C#을 간결 기본 접근을 지정할 수있는 특별한 프로퍼티 구문을 가지고 이유 내가 찾고 있던 대답. –

+0

"외부에서"무엇을 의미합니까? 필드가 공개이면 액세스 가능합니다. 이것은 C "struct"와 더 비슷합니다. 객체가 변경 가능해야하고 스레드 문제가없는 경우 문제가 없습니다. –

6

첫 번째 버전 (공개 속성)은 좋은 생각이 아닙니다. 두 번째가 더 좋습니다. "favor immutability", 조쉬 블로흐는 말할 것 같음 : 말했다되고 그건

public class Space { 
    private final String name; 
    private final String description; 

    public Space(final String name, final String description) { 
     this.name = name; 
     this.description = description; 
    } 

    public String getName() { 
     return name; 
    } 

    public String getDescription() { 
     return description; 
    } 
} 

, getters and setters tend to be overused.

4

자주 지나치게 단순화 된 "get/setters are evil"이라고 들었습니다. 아무도 (희망) 정말로은 데이터 객체에 문제가 있다는 것을 의미합니다. 나는 진짜 생각이 다음과 같다고 생각한다 :

"Getters/Setters는 단순한 데이터 저장 객체를 제외하고는 악마이다."그 자체는 "묻지 않는다"라는 전도이다.

클래스에 getter 및 setter가있는 것이 가장 이상적입니다. 모두이어야합니다.

어쨌든 논쟁입니다. 나는 그것에 동의하는지 모르겠다.

0

접근 자 패턴은 클래스의 구현 세부 정보를 숨기는 데 도움이됩니다 (예 :해시 테이블을 사용하여 속성을 저장하여 드문 드문 사용되는 클래스에 메모리 저장), 구현이 매우 복잡 할 수 있습니다 (예를 들어 액세서의 경우 12 행이 더 많음). 액세스 지정자 및/또는 코드를 추가 할 수 있습니다

class Space { 
    public String Name { get; set; } 
    public String Description { get; set; } 
    Space(final String name, final String description) { 
     this.Name = name; 
     this.Description = description; 
    } 
} 

대체 형태 :

private String _name; 
public String Name { 
    get { if (_name == null) FetchName(); return _name; } 
    private set { _name = value; } 
} 
관련 문제