2014-04-07 3 views
4

bean-friendly 클래스를 작성하고 싶습니다. (주로 bean을 사용하는) 경향을 관찰하여 필요한 매개 변수를 생성자에서 setter로 이동합니다 (초기 상태 설정을 마치면 init() 메서드 사용).약한 요구 사항 : 개체가 초기화되었는지 확인하는 방법

이 메소드는 자바 객체처럼 bean 인프라 없이도 클래스를 사용할 수 있기를 바란다. 상상할 수있는 것처럼, 모든 메서드에서 객체의 적절한 상태를 확인해야합니다. 어설 트 스타일. 위의 대한

빠른 데모 :

class A { 
    public int x; 
    public int y; 
    private int sum; 

    private boolean initialized = false; 

    public void init() { 
     sum = x + y; 
     initialized = true; 
    } 

    private void initCheck() { 
     if (!initialized) { 
      throw new IllegalStateException("Uninitialized object."); 
     } 
    } 

    public int getXMulSum() { 
     initCheck(); 
     return x * sum; 
    } 

    public int getYMulSum() { 
     initCheck(); 
     return y * sum; 
    } 

} 

더 좋은 연습이 있습니까? 당신이 프레임 워크를 사용하지 않는 점을 감안

+0

왜 '생성자'를 사용하지 않습니까? –

+0

@RongNguyen 방금 콩을 사용하여 사람들이이 메소드 (생성자 대신 setter)를 사용하는 추세를 보았습니다. 그것이 시각적으로 만족스러운 XML 구성이되기 때문에 내 추측이 될 것입니다.;) – vbence

+1

'PostConstruct'를 시도해 봤나 :-) –

답변

3

...

클래스가이 초기화 될 때까지, 내가 생성자를 사용하여 선호 사용에 대한 맞지 않은 경우. 블로그와 책에 흔들리지 마십시오. 생성자는이 목적을 위해 존재합니다. 생성자를 사용하면 코드 동기화 요구 사항도 제거됩니다.

생성자를 사용하지 않은 것을 볼 수있는 한 가지 이유는 초기화 코드가 많고 클래스 외부의 종속성이있는 경우입니다. 너무 많은 논리가 생성자에있는 경우 생성자의 예외에서 응용 프로그램을 깨지기 쉽고 복구하기 어려울 수 있습니다. 이 경우 콩의 인스턴스화 및 초기화를 처리 할 Factory class 옵션을 사용할 수 있습니다. 이렇게하면 호출 코드는 준비가 완료되고 에 맞게에 적합한 빈을 수신합니다.

사용할 좋은 패턴은 생성자 인수 목록이 긴 Builder pattern입니다.

이 시험 가능성에 대한 주된 이유 "나는 생성자에서 세터에 필요한 매개 변수를 이동하는 (주로 콩) 경향을 발견했다." "비싼"종속성을 초기화하지 않고도 Bean의 기능을 테스트 할 수 있다면 생성자에 포함시키지 않는 것보다 이점이 있습니다. 말하자면, 나는 또한 이것이 문제라면, 당신은 아마도 당신의 빈에 너무 많은 기능을 가지고 있고 당신은 그것을 분해하는 것이 더 낫다고 주장 할 것입니다. Single responsibility principle에서 제안했습니다.

+1

브래드가 자신의 팩토리를 제안하고 생성하는 경우 작성중인 구현을위한 인터페이스를 만드는 것을 잊지 마십시오. 인터페이스를 반환하는 것으로 공장을 선언하십시오. 이 인터페이스는 일반적으로 init() 메소드를 포함하지 않습니다. 이것은 클래스의 사용자가 그것을보고 그것을 스스로 부르려는 유혹을받지 못하게합니다. – aerobiotic

+1

감사합니다. 작성자 패턴은 실제로 질문의 대부분의 문제를 다룹니다. – vbence

1

세터는 순환 종속성을 처리 할 수 ​​있으므로 생성자 인수보다 더 일반적입니다.

순환 의존성이 없다면 생성자 인수를 유지하는 것이 좋을 것입니다. 의존성을 강화하기위한 목적 일 것입니다.

그러나 가능하면 모든 논리를 생성자에 넣지 마십시오. 브래드 (Brad)가 말했듯이, 응용 프로그램이 부서지기 쉽습니다. 전체 Spring 환경은 생성자 중에 사용 가능하지 않을 수 있습니다.

생성자가 나중에 실제 메디 드에서 나중에 사용할 수 있도록 참조를 기억할 수 있도록 디자인하십시오. 가능한 경우 init() 메소드를 사용하지 마십시오.