2014-11-26 1 views
1

이 주제에 대해 조사한 결과 생성자를 통해 필드를 할당하는 것이 setter가 아닌 더 나은 방법이라는 것을 알았습니다. 그러나 10 개의 필드가있는 객체가 있으면 어떻게됩니까? 그러면 큰 생성자가 생겨 여전히 좋은 습관으로 간주 될까요? 예를 들어setter 또는 생성자를 통해 여러 필드 할당

:

public DefaultAccount(Long id, String name, String surname, String username, String password, Role role) { 
    this.id = id; 
    this.name = name; 
    this.surname = surname; 
    this.username = username; 
    this.password = password; 
    this.role = role; 
    } 

이 생성자는 나에게 큰 보인다.

+0

나쁜 습관은 아닙니다. 당신은 생성자가 지능을 포함하지 않는만큼 크지 않습니다. –

+0

생성자에 필드가 두 번 더 있으면 어떻게됩니까? 아직도 정상인가? – Bravo

+0

생성자는 모든 필드를 할당 할 수 있습니다. 보통 하나의 클래스가 많은 필드를 가지고 있고 정상일 수 있다고 생각한다면, 그것들을 모두 할당하는 생성자를 가질 수 있습니다. 하지만 당신은 다음 매개 변수가 적은 다른 생성자를 가져야합니다. –

답변

1

제 의견으로는 상황에 따라 다릅니다. 나열한 예제는 단순한 유형 만있는 꽤 간단한 클래스입니다. 나는 그것을 모두 고려할 것이다. 그러나 나는 세터를 고려한 진술에 대해 정말로 확신하지 못한다. 그러나 고려해야 할 것이 있습니다 :

큰 프레임 워크 중 일부 (Spring, Hibernate ...)로 작업하는 경우 많은 것들이 새로운 생성자 (new Person()과 같은)를 사용하여 객체를 인스턴스화합니다. 필드에 setter를 호출합니다. 사용할 수없는 것이 있으면 예외를 던질 것입니다.

나열된 것과 같은 생성자가 있으면 좋습니다. 그러나 어쨌든 세터가 필요할 것입니다. 복잡한 경우 리팩토링을 고려하십시오. 어쩌면 너무 많은 의존성이 필요할지도 모른다. 어쩌면 10 개의 매개 변수 대신 다른 객체 (예 : 구성)에 캡슐화 할 수 있습니다.

필드를 공개하지 마십시오. 어떤 시점에서 세터에서 특정 조건을 확인해야하고 필드가 공개이면 리팩토링에 약간의 시간을 할애해야합니다. 필요한 경우 setter의 전제 조건을 확인하고 예외를 throw합니다. 모든 매개 변수가 필수 인 경우 효과적인의 항목 # 2에 제안, 다음 빌더에게 패턴을 사용하는 것을 고려 Java setting private fields inside constructors

0

getters 및 setters는 여러 클래스가있을 때 사용되며 필드가 비공개 (또는 보호되고 다른 패키지에서 액세스해야하는 경우) 할 때도 사용됩니다. getter 및 setter를 만들 필요가없는 단일 클래스 만있는 경우 생성자에서 할당하지 않으려는 경우 객체에 값을 직접 할당 할 수 있습니다. (생성자에서 할당하지 않으려는 경우)

1

실제로 많은 양의 어떤 방법 (생성자 포함)의 매개 변수를 사용하는 것은 나쁜 습관입니다.

먼저 계정과 직접 관련이없는 필드가있는 DefaultAccount 생성자가 있습니다.

예를 들어 이름과 성을 다른 (User?) 클래스로 추출해야합니다.

1

:

나는 또한 조금 더 세터에 대한 질문을합니다 유래에이 질문을, 발견 대신 직접 원하는 개체를 만드는 말한다 조슈아 블로흐에 의해 자바 ...

, 클라이언트는 필요한 매개 변수 모두와 생성자 (또는 정적 공장)를 호출하고 빌더 OBJ를 가져옵니다 ect. 그런 다음 클라이언트는 빌더 객체에 setter와 유사한 메소드 을 호출하여 각 선택적 매개 변수를 설정합니다. 마지막으로 클라이언트는 매개 변수없는 build 메서드를 호출하여 개체를 생성합니다.이 개체는 변경할 수 없습니다.

2

여러 매개 변수를 사용하는 생성자 (또는 여러 매개 변수 집합을 사용하는 여러 생성자가있는 경우)의 한 가지 문제점은 여러 매개 변수가 같은 형식을 가질 때 발생할 수있는 실수입니다. 당신의 예를 생각해 보면 이름과 성의 순서를 잘못 잡는 것이 얼마나 쉬운 일인지 생각해보십시오.

이 해결책은 작성자 패턴을 사용하는 것일 수 있습니다.

은이 어떻게 작동하는지에 포괄적 인 모양입니다 : the builder pattern in practice 는 다음과 같은 스택 오버플로 질문은 꽤 잘 커버 : 제 생각에는 when would you use the builder pattern

1

가장 효과적인 방법은 아래로 문제를 휴식하는 것

public DefaultAccount(Long id, String name, String surname, User user) 
{ 
    this.id = id; 
    this.name = name; 
    this.surname = surname; 
    this.user = user; 
} 

// From second class User 
public User(String username, String password, Role role) 
{ 
    this.username = username; 
    this.password = password; 
    this.role = role; 
} 

이렇게하면 막대한 생성자를 피할 수 있으며 코드 유지 관리 성과 가독성을 향상시킬 수 있습니다.

here과 같은 구성 클래스 을 사용할 수도 있습니다.

관련 문제