2013-03-20 2 views
0

는이 같은 클래스를 가지고있다. 그러나 close()를 호출하면 이후에 makeCallOne() 또는 makeCallTwo()를 호출하면 예외가 반환됩니다.Java 객체를 "비활성화"하는 방법은 무엇입니까? 사용자가이 클래스의 인스턴스를</p> <pre><code>public class DatabaseSession { public makeCallOne() {...} public makeCallTwo() {...} public close() { ... } } </code></pre> <p>경우에, 나는 그들을 makeCallOne 및 makeCallTwo를 호출 할 수 있기를 기대 :

각 방법의 맨 위에 if 문을 사용하여이 작업을 수행 할 수 있지만 작성하는 것을 잊기 쉽습니다. "이 물체는 현재 쓸모가 없습니다. 더 이상 호출 할 수 없습니다."라고 말하는 데 사용되는 표준 메커니즘은 무엇입니까?

+0

말하자면 상태 플래그를 사용하고 메소드의 시작 부분에서 상태를 확인한 다음 필요에 따라 예외를 throw합니다. 내가 생각할 수있는 모든 기술은 기본적으로 같은 방식으로 작동합니다. check/run/throw – MadProgrammer

+1

모든 메소드의 시작 부분에 if 문을 작성하는 대신 if 문을 개인 메소드에 작성하고 호출 할 수 있습니다. – Ozzie

+0

@Ozzie - 거기에서도 예외가 발생합니다. 그런 다음'ensureOpen()'과 같이 호출 될 수 있습니다. – OldCurmudgeon

답변

2

Java 클래스 라이브러리에서 비활성화되는 호출이 없습니다.

State 열거 형을 만들고 방어 프로그래밍으로 모든 방법의 시작 부분에서 확인해야합니다. 그런 다음 클래스는 특정 상태에서 특정 작업을 수행하는 유한 상태 시스템이됩니다. 그래서 여러분은 인스턴스화 된 다음 열리고 나서 닫힐 것입니다.이 정보는 State 열거 형으로 인코딩 될 수 있습니다.이 열거 형은 유연하고 계속해서 변경 될 수 있습니다.

2

소유자가 범위를 벗어나게합니다. 그것은 표준 메커니즘입니다. 그런 다음 방어적인 프로그래밍 (철학에 따라 주장 대신 주장 할 수 있음)과 같이 모든 makeCall 함수의 내부에 if 문을 작성합니다.

0

오브젝트가 생성 될 때 켜지는 (true) 모든 인스턴스 특정 플래그를 사용할 수 있으며 해당 오브젝트에서 close 메소드가 호출 될 때 OFF (false)로 설정할 수 있습니다. 플래그의 값을 검사하고 OFF 인 경우 예외를 던질 수 있습니다 (false로 설정 됨, 즉 객체 닫기 메서드가 호출됨을 나타냄).

희망이 도움이됩니다.

2

는 지금까지 내가 당신 만이 플래그를 사용하여 그런 일을 할 수있는 알고, 당신은 그러나 검증 방법에 if 문을 배치 할 수 있습니다

public class DatabaseSession { 
    private State state; 

    ... 


    public makeCallOne() throws Exception { 
     if (state == State.CLOSED)) { 
      throw new Exception("Database Session has already been closed"); 
     } 
     ... 
    } 
    public makeCallTwo() throws Exception { 
     if (state == State.CLOSED) 
      throw new Exception("Database Session has already been closed"); 
     } 
     ... 
    } 

    public close() { 
     state = State.CLOSED; 
     ... 
    } 

    private enum State { 
     OPEN; 
     CLOSED; 
    } 

} 예를 들어

. 그래서 같이 :

public class DatabaseSession { 

    private boolean closed = false; 

    private void validateSession() { 
     if(closed) { 
      throw new ObjectInvalidException(); 
     } 
    } 

    public void makeCallOne() { 
     validateSession(); 
     /*do something*/ 
    } 
    public void makeCallTwo() { 
     validateSession(); 
     /*do something*/ 
    } 

    public void close() { 
     closed = true; 
    } 
} 

나는 내 자신의 예외 (Throwable를 확장)를 정의한다.

+1

'validateSession'은 아마도'private'이어야합니다. – OldCurmudgeon

+0

"닫힌"필드를 초기화 할 필요가 없습니다. – maszter

+0

@OldCurmedgeon 그래, 개인적으로, 그것을 지적 해 주셔서 감사합니다. – gordonk