2017-03-07 6 views
2

개체의 수명 동안 한 번만 호출해야하는 메서드가 있습니다. 이 경우를 보장하기 위해 메서드는 객체의 부울 플래그를 true으로 설정하므로 나중에이 메서드가 이미 실행되었는지 확인할 수 있습니다. 이 메서드는 두 번째 시간 동안 단일 개체의 수명 동안 호출되는 경우 현재 IllegalArgumentException (설명 메시지가) 던지고 있지만 그 문제가 실제로 인수 자체가 아니기 때문에 나에게 아주 옳은 느낌이 들지 않습니다. IllegalArgumentException보다 나은 예외가 있습니까?메서드가 여러 번 호출되지 않도록하려면 어떤 예외를 사용해야합니까?

이 경우 assert 문을 사용하지 않기로 선택했습니다. 클래스와 메서드가 모두 패키지 외부에서 볼 수 있기 때문에 내 패키지 외부의 코드로 인해 문제가 발생할 수 있습니다. 그 생각이 맞습니까?

+7

'IllegalStateException'. 플래그가 메소드를 다시 호출하지 않아야 함을 나타 내기위한 값으로 설정되었으므로 오브젝트가 해당 메소드를 호출하는 데 불법 상태입니다. –

답변

4

IllegalStateException을 던집니다.

예외가 일반 제어 흐름에 속해서는 안되기 때문에 다음 번 메서드 호출이 성공할 것인지 여부를 나타내는 부울을 반환하는 동반 메서드를 추가해야합니다.

그러한 컴패니언 방법의 예로는 Iterator#hasNext()입니다.

잘 설계된 API는 일반적인 제어 흐름에 대한 예외를 사용하는 고객을 강제하지 않아야합니다. 이 특정 예측할 수없는 조건에서만 호출 될 수있는 "상태 종속적"방법을 사용하는 클래스는 이 상태 의존적 메소드를 호출하는 데 적합한 지 여부를 나타내는 별도의 "상태 테스트"메소드가 있어야합니다. 예를 들어, Iterator 인터페이스는 상태 종속적 인 메소드 next와 에 해당하는 상태 테스팅 메소드 hasNext를가집니다.

1 일

: 효과적인 자바, 제 9 장에서 : 예외

1

여기에 잘못된 디자인을 만들었다는 점이 특정 예외 유형보다 더 걱정스러운 점은 무엇입니까?

좋은 인터페이스는 올바른 일을 쉽게하고 잘못된 일을 어렵게 만듭니다.

의미 : 현재 구현하면 해당 메서드를 두 번 쉽게 호출 할 수 있습니다. 이제 각각의 메소드가 이미 호출되었는지 클라이언트가 항상 확인하도록합니다.

따라서 예외 유형에 시간을 소비하는 대신 뒤로 물러나 한 클래스를 두 개의 클래스로 해부하는 방법을 예를 들어 클래스로 지정하십시오. 그리고 특정 메소드를 호출하면 다른 객체를 사용할 수있게 멋지게 찾을 수 있습니다. 또는이 문제를 해결하기 위해 상태 시스템을 사용해야하는지 확인하십시오.

+1

나는 동의해야한다. Cf. 'hasNext'와'next' 메소드. – mike

+0

제안 사항이 맞는 시나리오가 있습니다. 그러나 그것은 항상 사실이 아닙니다. – GhostCat