2017-05-16 7 views
-3

4 개 필드, 생성자와 게터와 기본 콩 형식의 클래스를 고려 : I 클래스의 사용자에 부과하고 싶은 몇 가지 규칙이 있습니다강제 클래스 인스턴스 규칙

public class Foo { 
    private final String id; 
    private final Bar bar; 
    private final boolean invalid; 
    private final String errorMessage; 

    public Foo(String id, Bar bar, boolean invalid, String errorMessage) { 
     this.id = id; 
     this.bar = bar; 
     this.invalid = invalid; 
     this.errorMessage = errorMessage; 
    } 
} 

. 예를 들어

: id 매개 변수가 null 또는 비어해서는 안

  • 바 null가 아닌 경우, 무효가 거짓이어야하며 ERRORMESSAGE은 null이어야합니다 ERRORMESSAGE null가 아닌
  • 바는 null이어야합니다
  • 무효에 해당하는 경우, ERRORMESSAGE이 비어 있지 않은 null이 아닌이어야하며, 줄이 null이어야합니다

T hese 규칙은 기본적으로 유효한 Foo 객체의 네 가지 유형으로 변환됩니다.

(aString, false, null, null), (aString, false, aBar, null), (aString, true, null, anErrorMessage) 및 (aString, false , null, anErrorMessage).

클래스 사용자가 항상 해당 클래스 중 하나를 만들도록 강제로 설정할 수 있습니까?

+0

[예외] (https://docs.oracle.com/javase/tutorial/essential/exceptions /)을 참조하십시오. – Turing85

+0

"* *이어야 함 *"의미 : 유효성 검사/거부 또는 강제 할당? –

+0

"이어야 함"을 의미합니다. "개체는 다음과 같이 인스턴스화되어야합니다." 위의 편집을 참조하십시오. – bez

답변

0

Foo 개체를 만들 때 클래스 사용자가이를 존중하도록 할 수 있습니까?

예,이 작업은 생성자 내에서 수행하는 것이 가장 좋습니다. 기본적으로 생성자 내에서 모든 유효성 검사를 수행하거나 작업을 수행하는 다른 메서드를 호출 할 수 있으며 이 아니고이 아닌 경우 사용자가 개체를 인스턴스화하려고하면 예외를 throw해야합니다. 그 원인.

오버로드 된 생성자를 사용해야합니까?

하나의 생성자에서이 작업을 수행하고 필요할 경우 다른 방법으로 개별적인 유효성을 검사하는 것이 좋습니다.

내장 된 예외 중 일부가 throw되는 예외의 원인을 설명하지 않는다고 생각하는 경우 클래스의 사용자에게 해당 예외가없는 원인을 식별 할 수있는 적절한 세부 사항으로 예외를 구현할 수 있습니다 인스턴스화.

읽기 :

Builder Pattern

+0

여기서'Builder '패턴이 유용 할 것 같습니다. –

+0

사실, OP에 대한 읽기 링크가 있어야합니다. –

1

final을해야 id 것 같은데, 또한 아마도 다른 분야. 생성자 매개 변수를 검사하고 틀린 경우 런타임 예외를 발생시킵니다. 불변성을 문서화하려면 assert을 사용하십시오. 처음에 인스턴스 변수 (필드) 없었다 말았어야 invalid 또는 errorMessage에 대한 필요가 없습니다처럼

public class Foo { 
    private final String id; 
    private final Bar bar; 

    public Foo(String id, Bar bar) { 
    if (id == null || bar == null) { 
     throw new IllegalArgumentException("Constructor argument was null"); 
    } 
    this.id = id; 
    this.bar = bar; 
    assert this.id != null && this.bar != null; 
    } 

    // Getters and overrides 
} 

비슷해 보인다.

+0

모두 필요합니다. 결승전은이 예의 맥락에서 부적합하다. 그것들은 단지 생성자에게 전달되어야하는 4 개의 필드이지만 그 4의 어떤 조합도 유효하지 않습니다. 예를 들어 ("someID", aBar, true, null) 유효하지 않으므로이를 방지하고 싶습니다. – bez

+0

글쎄,이 예제가 보여주는 것을 뛰어 넘는 유효성 검사 목록을 확장하고 위반 한 경우 IllegalArgumentException 또는 IllegalStateException을 던져 모든 설정자에 대해 동일한 작업을 수행하면됩니다. 모든 필드를 마지막으로 만들면 좋습니다. 'invalid'와'errorMessage'가 필요없는 이유는 그 값이 다른 값에 의해 결정된다는 것입니다. 그래서 그것들을 저장하는 것이 중복되고 버그의 출입구가됩니다. –