0

我有这样的课:

public class DatabaseSession {

  public makeCallOne() {...}
  public makeCallTwo() {...}
  public close() { ... }

}

如果用户实例化这个类,我希望他们能够调用 makeCallOne 和 makeCallTwo。但是,如果他们调用 close(),那么随后对 makeCallOne() 或 makeCallTwo() 的任何调用都应返回异常。

我可以在每个方法的顶部使用 if 语句来做到这一点,但这很容易忘记写。用什么标准机制说“这个对象现在没用了。你不能再调用它了。”?

4

4 回答 4

2

所有者让它超出范围。这是标准机制。然后你在所有 makeCall 函数中编写 if 语句,作为防御性编程(你可以争论一个断言,取决于哲学)。

于 2013-03-20T20:03:19.773 回答
2

java 类库中没有禁用调用。

您应该创建一个State枚举并在每个方法的开头检查它作为防御性编程。然后,您的班级将成为有限状态机,您可以在其中在某些状态下执行某些操作。所以你可能会被实例化,然后打开,然后关闭等等。这些信息可以编码在一个State枚举中,它是灵活的,并且可以在未来进行更改。

例如,

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;
    }

}

于 2013-03-20T20:07:07.447 回答
2

据我所知,您只能使用标志做类似的事情,但是您可以将 if 语句放在验证方法中。像这样:

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)。

于 2013-03-20T20:11:37.777 回答
0

您可以使用任何特定于实例的标志,该标志将在创建对象时打开(true),并在对该对象调用 close 方法时将其设置为 OFF(false)。您可以随时检查标志的值,如果它为 OFF(设置为 false,即表示调用了对象的 close 方法),则抛出异常。

希望这可以帮助。

于 2013-03-20T20:06:14.040 回答