2013-07-22 3 views
1
나는이 문제에 접근하는 가장 좋은 방법 일 것입니다 무슨 궁금

다음과 같이 내가 추상 클래스가자바 추상 ​​클래스 생성자 범위

:

public abstract class AbstractTestClass 
{ 
    public AbstractTestClass(String text) 
    { 
     SomeObject someObject = SomeStaticClass.getSomeObjectFromText(text); 
     //etc... 
     this.property1 = someObject.property1 
     //basically populate properties based off of someObject 
    } 
} 

를 그리고 구현 예 :

public class AbstractTestClassImpl 
{ 
    public AbstractTestClassImpl(String text) 
    { 
     super(text); 
     SomeObject someObject = SomeStaticClass.getSomeObjectFromText(text); 
     //do stuff with someObject that isn't done in the super constructor because it may vary per different implementations of the abstract class 
    } 
} 

그래서이 예제 코드 스 니펫에서 someObject가 두 번 생성되며, 한 번만 만들거나 그냥 그대로두면 궁금합니다.

분명한 해결책은 someObject을 AbstractClass의 멤버 변수로 만드는 것이지만, someObject이 전혀 필요하지 않은 경우도 있습니다.

생성자 고려 :이 경우

public AbstractTestClass(int i, int j, char c) 
{ 
    //do stuff where someObject is not required 
} 

를, 그것 전혀 사용하지 때문에 의미가 someObject 회원을 가지고하지 것이다.

someObject은 하나의 생성자에서만 사용된다고 가정하십시오.

어떻게 접근하는 것이 가장 좋을까요?

+0

'someObject'를 항상 인스턴스 멤버로 사용하지 않더라도 인스턴스 멤버로 갖는 문제점은 무엇입니까? – chancea

+0

그건 내 추측의 일부 야. 나는 그 좋은 연습이 그것을 할 것인지 확실하지 않다. – Rhs

+0

반면 완전히 완전히 분리 된 두 개의 생성자가 필요하다면 클래스가 추상화되지 않은 것처럼 들릴 수도 있습니다. – chancea

답변

0

먼저 정적 팩터 리 메소드가있는 경우 동일한 텍스트로 정적 팩토리 메소드를 호출 할 때마다 동일한 객체를 반환 할 수 있습니다. 그렇게 할 수없는 경우 보호 된 인스턴스 변수를 만들거나 SomeObject 매개 변수를 사용하는 보호 된 컨스트럭터를 만들 수 있으며 매개 변수가 null 인 경우에만 새 인스턴스를 만들 수 있습니다. 서브 클래스는 SomeObject을 만들어 수퍼 클래스에 전달할 수 있습니다.

2

코드에서 가장 큰 냄새는 값을 생성자에 매개 변수로 전달하는 대신 생성자 내에서 정적 클래스를 호출하는 것입니다. 가장 도움이 될 것이라고 생각하는 것은 묻습니다.

어떻게 테스트 할 수 있습니까?

JUnit에서 몇 가지 단위 테스트를 작성하십시오. PowerMockito는 정적 클래스를 모의 할 수있는 기능을 제공하지만이 시나리오에서는 테스트 코드가 동작을 이해하는 대신 코드를 이해해야하기 때문에 효과적인 테스트를 제공하지 않습니다.

나는 진짜로이 기사 Write Testable Code를 즐기고 때때로 그것을 참조한다. 개체에 대한 참조를 반환 init 메소드로 추상 클래스에서

이동 코드를 구현 :

+0

'String text'를'filename'으로 생각하십시오. 파일 이름을 전달하여 객체의 인스턴스를 만들고 싶습니다. 정적 개체는 단순히 개체의 인스턴스를 만들고 새로 만든 개체에 속하는 함수를 호출하는 정적 함수입니다. 그저 붙여 넣기 만 복사 할 수는 있지만 정적 함수를 포함하기로 결정했습니다. 그 이유는 내 객체가 정적 호출이하는 일을 너무 많이 알 필요가 없다는 것을 의미하기 때문입니다. 실제로 되돌아 보면 정적 클래스를 호출하는 것은 잘못되었습니다. 나는 그것을 편집해야한다. – Rhs

+0

그건 내 요점이다. 결과 값이 매개 변수로 전달되는 경우 해당 객체는 정적 클래스에 대해 알지 못합니다. 더 많은 코드를 보지 않고 POJO 또는 번역사를 작성하는지 알 수 없습니다. 그럼에도 불구하고 테스트가 설계에 도움이 될 것입니다. –

0

내가 디자인에 대해 언급하지만, 당신이 위에서 언급 한 것을 할 필요가 부여되지 않습니다, 여기에 내가 제안 것입니다 abstract 클래스의 클래스 호출 init 메소드는 반환 된 참조를 사용하여 추가 처리를 수행합니다.

이렇게하면 문제가 해결됩니다.

건배 !!

관련 문제