2012-02-10 3 views
1

X, YZ 필드를 가진 기본 클래스 C을 사용하고 있습니다.자바 하위 유효성 검사 디자인 패턴

C1C이며, 추가 필드는 T입니다. C1 생성자에서

, 나는 필드 X, YZ 일부 하드 코딩 값 (C) 생성자 슈퍼를 호출 할. 그런 다음 T을 설정합니다.

생성자에서 무엇인가를 수행하여 C1의 모든 입력란을 자동으로 확인하는 패턴이 있습니까? 그래서 자동 검증을 기본 클래스로 푸시하려고합니다.

C1 생성자의 모든 문 앞에 슈퍼 생성자를 호출해야합니다. 나는 어떤 추상적 인 validate() 방법으로 시작했지만, 나는 올바른 길을 가고 있지 않다.

감사합니다. C1은 C의 전문 분야이기 때문에 원칙적으로

답변

0

나는 슈퍼 클래스가 자신을 검증해야한다고 말할 것이다. 객체는 자체 계약을 시행해야합니다. C의 값에 대한 유효성 검사는 자체 생성자에서 수행해야합니다. 마찬가지로, 서브 클래스는 자신을 검증해야한다.

public class A { 
    private int x; 

    public A(int x) { 
     if (x < 0) throw new IllegalArgumentException("x cannot be negative"); 
     this.x = x; 
    } 
} 

public class B extends A { 
    private String y; 

    public B(int x, String y) { 
     super(x); 
     if (y == null) throw new IllegalArgumentException("y cannot be null"); 
     this.y = y; 
    } 
} 
+0

그래서 B에서 구현 된 메소드를 B에서 자동으로 호출하는 방법은 없습니다. 바로 B의 생성자 끝에 ... 맞습니까? – user1158641

+0

아니요, A는 서브 클래 싱 된 적이 전혀 없어야합니다. 그 코드는 B에 속해 있지 않습니다. 클래스를 투시력으로 만들고 미래를 예측하도록 요청할 것입니다 : "6 개월 후, 프레디는 나를 하위 클래스로 만들 것입니다. 나는 그의 클래스의 검증 호출을 내 물건." 미친. – duffymo

+0

A는 B를 모른다. 그러므로 불가능하다. –

0
class C{ 
    Object x, y, z; 
    public C(Object x, Object y, Object z){ 
     this.x = x; 
     this.y = y; 
     this.z = z; 
    } 
    public boolean validate(){ /**do stuff**/} 
} 

class D{ 
    public D(/**args**/){ 
     super(/**args**/); 
     if(validate()){ 
      /**do stuff**// 
     } 
    } 
} 
+0

을 작동합니다. – user1158641

2

, C 그러나, 당신이 할 수있는 것은 C에서() 메소드를 추상 유효성 검사를 할 것입니다, C1의 속성에 대해 알고 안, 그 구현해야합니다 C1에 의해. 그런 다음 C의 생성자에서 추상 메서드를 호출 할 수 있습니다. C1은 validate()를 구현해야하기 때문에 속성/필드 유효성 검사를 추가 할 수 있습니다.

+0

예.이 경우 T 특성을 설정하기 전에 C1 유효성 검사가 호출됩니다. 이것은, 그리고 제가 언급했기 때문에, super() 호출은 첫 번째 문장이어야합니다. – user1158641

+0

그런 경우 C 생성자가 호출 된 시점을 자동으로 확인할 수 없습니다. 그러면 C1 클래스가 클래스 계층에 추가하는 자체 속성임을 검증하도록 남겨 둡니다. –

+0

내가 원한 것은 아니야. – user1158641

1

모든 OO 원칙에 위배되지만 Java의 반사 속성을 활용할 수 있습니다. 리플렉션을 통해 클래스가 가지고있는 메소드와 필드를 찾을 수 있습니다. 따라서 하위 클래스 객체를 기본 클래스로 전달할 수 있으며 기본 클래스는 모든 필드를 확인하고 유효성을 검사 할 수 있습니다. 서브 클래스 생성자의 끝에이 작업을 수행하면 유효성 검증 메소드가 값이 유효한지 여부를 확인하는 값을 리턴하게 할 수 있습니다.

나는 내가 갈 올바른 방법으로 생각하지 않는다는 것을 명시하고 싶지만 내가 언급 한 바와 같이 내가는 자동 방식으로 그것을 할, 기본 클래스에 검증을 추진하고자,

+0

"올바른 방법이 아닌가?"- 네,하지만 효과가 있습니다. 어리 석음을 금지하는 언어는 없습니다. – duffymo

+0

결국 나타납니다. 나는 그것을 보장하지 않습니다. 그것은 단지 당신이 "this"를 전달하는 생성자 내에서 메서드를 호출하면 개체가 결국 완전히 생성되지 않았기 때문에 이것이 작동하는지 확실하지 않다는 사실을 알게되었습니다. 그래서 이것은 null 일 수 있습니다. 그것을 시험해보고 여기로 돌아와서 우리 모두가 효과적인지 아닌지 안다. 감사 – guitarflow