我有一个这样的课程:
public class DatabaseSession {
public makeCallOne() {...}
public makeCallTwo() {...}
public close() { ... }
}
如果用户实例化了这个类,我希望他们能够调用makeCallOne和makeCallTwo。但是,如果它们调用close(),那么对makeCallOne()或makeCallTwo()的任何后续调用都应该返回异常。
我可以在每个方法的顶部使用if语句执行此操作,但这很容易忘记编写。用什么标准机制来说“这个对象现在没用了。你不能再打电话了。”?
答案 0 :(得分:2)
所有者让它超出范围。这是标准机制。然后你在所有makeCall函数中编写if语句作为防御性编程(你可以争论一个断言,取决于哲学)。
答案 1 :(得分: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;
}
}
答案 2 :(得分: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
)。
答案 3 :(得分:0)
您可以使用任何特定于实例的标志,在创建对象时将打开(true),并在对该对象调用close方法时将其设置为OFF(false)。你可以随时检查标志的值,如果它是OFF,则抛出异常(设置为false,即它表示调用了对象close方法)。
希望这会有所帮助。