2013-03-07 3 views
5

일부 Java 클래스는 제대로 작동하려면 공개 getter 및 setter가있는 개인 속성이 있어야합니다. 예를 들어, JSF 빈과 JPA 엔티티가이를 필요로합니다. 이러한 라이브러리가 아닌 경우 getter가 없어야하고 확실히 setter가 없어야하는 속성이있을 수 있습니다. 또한 빈 생성자는 종종 사용자 정의 코드에서 사용하기를 권장하지 않습니다. 예를 들어,권장되지 않는 메소드

@Entity 
public class MyEntity implements Serializable { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 

    public MyEntity() {} 

    public Long getId() { 
     return this.id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 
} 

이 클래스에서 setId 메소드는 수동 코드에 의해 호출되어서는 안됩니다. 이 메소드는 더 이상 사용되지 않으므로 @Deprecated 주석이 잘못 될 수 있습니다.

@Deprecated 이외의 다른 방법으로 사용하지 말아야 할 방법이 있습니까?

+0

이 질문은 JSF 및 JPA와 관련이 없습니다. 여전히 이러한 프레임 워크를 언급 할 가치가 있습니다. –

+0

예제가 좋지 않습니다. 이 경우 세터 사용을 왜 방해 하시겠습니까? 그것의 값을 설정할 수 있기를 원하는 모든 종류의 데이터 조합을 저장할 수있는 엔티티 개체입니다. – Perception

+0

초기화 할 때 고유 식별자를 변경하지 않으려 고합니다. –

답변

3

JPA 엔티티는 공개 getter 및 setter가 필요하지 않습니다. 값은 리플렉션을 사용하여 설정됩니다 (적어도 사용하고있는 EclipseLink 또는 Hibernate를 사용할 때).

이 특별한 예에서는 설정자를 그냥두고 나갈 수 있으며, 습관을 버리고 결코 문제가되지 않습니다. 참고 : 속성 및 getter/setter의 경우 Java 명명 규칙을 따르십시오. 일부 라이브러리/프레임 워크 (잘못 imo)가 이에 의존합니다.

질문의 글로벌 개념에 관해서는, 나는 문서를 포함하는 제안을 보지 못했지만 놀랍다. 문서는 항상 사용자와 가장 잘 소통하며 항상 존재합니다.

/** 
* WARNING! DO NOT USE THIS UNLESS YOU ARE GOD! 
* This will probably break stuff unless... 
* .... 
*/ 
public void doEvilHackishThings() 
{ 
    // Stuff happens here. 
} 

코드를 올바르게 문서화하면 개발자가 물건을 깰 가능성이있을 때를 알게됩니다. 부두 코드를 적용하지 않도록하십시오. 좋은 문서는 그것이하는 일과 수행하는 방법에 대해 자세히 설명합니다. 그의 올바른 생각에 개발자가 악의적 인 이유를 모른 채 예제 메서드를 만질 것입니다.

0

getter 및 setter를 숨길 수있는 구체적인 클래스가 지원하는 인터페이스를 사용합니다. 이것은 또한 인터페이스에서 사용할 수있는 게터가 없으므로 Tell을 권장합니다. 묻지 마십시오. 생성자 사용법은 공장에서도 숨길 수 있습니다.

+1

거의 모든 엔티티의 인터페이스입니까? –

+0

그다지 특이하지 않습니다. EMF도 그렇게합니다. – SpaceTrucker

관련 문제