如何";禁用";Java对象?
我有一门课是这样的:如何";禁用";Java对象?,java,database,invalidation,Java,Database,Invalidation,我有一门课是这样的: public class DatabaseSession { public makeCallOne() {...} public makeCallTwo() {...} public close() { ... } } 如果用户实例化这个类,我希望他们能够调用makeCallOne和makeCallTwo。但是,如果调用close(),则对makeCallOne()或makeCallTwo()的任何后续调用都应返回异常 我可以在每个方法的顶部使用if语句来
public class DatabaseSession {
public makeCallOne() {...}
public makeCallTwo() {...}
public close() { ... }
}
如果用户实例化这个类,我希望他们能够调用makeCallOne和makeCallTwo。但是,如果调用close(),则对makeCallOne()或makeCallTwo()的任何后续调用都应返回异常
我可以在每个方法的顶部使用if语句来实现这一点,但这很容易忘记编写。使用什么标准机制来表示“这个对象现在没用了。你不能再调用它了。”?所有者让它超出范围。这是标准的机制。然后在所有makeCall函数中编写if语句,作为防御性编程(根据原理,您可以主张使用断言)。所有者让它超出范围。这是标准的机制。然后在所有makeCall函数中编写if语句,作为防御编程(根据原理,您可以主张使用断言)。您可以使用任何特定于实例的标志,该标志在创建对象时将被打开(true),并在对该对象调用close方法时将其设置为OFF(false)。您可以始终检查标志的值,如果它处于关闭状态,则抛出异常(设置为false,即表示调用了objects close方法)
希望这有帮助 您可以使用任何特定于实例的标志,该标志将在创建对象时启用(true),并在对该对象调用close方法时将其设置为OFF(false)。您可以始终检查标志的值,如果它处于关闭状态,则抛出异常(设置为false,即表示调用了objects close方法)
希望这有帮助 java类库中没有禁用调用 您应该创建一个
状态
枚举,并在每个方法的开头将其作为防御性编程进行检查。然后,您的类将成为一个有限状态机,您可以在其中以特定的状态执行特定的操作。因此,您可能会被实例化,然后打开,然后关闭,等等。这些信息可以在状态
枚举中进行编码,这是一种灵活的、开放的,可以继续更改
比如说,
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;
}
}java类库中没有禁用调用 您应该创建一个
状态
枚举,并在每个方法的开头将其作为防御性编程进行检查。然后,您的类将成为一个有限状态机,您可以在其中以特定的状态执行特定的操作。因此,您可能会被实例化,然后打开,然后关闭,等等。这些信息可以在状态
枚举中进行编码,这是一种灵活的、开放的,可以继续更改
比如说,
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;
}
}据我所知,您只能使用标志执行类似的操作,但是您可以将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;
}
}
我将定义我自己的异常(extend
Throwable
)。据我所知,您只能使用标志执行类似的操作,但是您可以将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;
}
}
我会定义自己的异常(extend
Throwable
)。如您所说,使用状态标志,在方法的开头检查其状态,并根据需要抛出异常。我能想到的任何技术基本上都是一样的,检查,运行/跳过在每个方法的开头写一个if语句,你可以在一个私有方法中写一个if语句并调用它。@Ozzie-然后从那里抛出异常。然后可以调用类似于ensureOpen()
@OldCurmudgeon的东西,这正是我的意思:)正如您所说,使用状态标志,在方法开头检查其状态,并根据需要抛出异常。我能想到的任何技术基本上都是一样的,检查,运行/跳过在每个方法的开头写一个if语句,你可以在一个私有方法中写一个if语句并调用它。@Ozzie-然后从那里抛出异常。它可以被称为ensureOpen()
@OldCurmudgeon这正是我的意思:)validateSession
可能应该是private
。你不需要初始化字段“closed”。@OldCurmedgeon是的,它应该是private,感谢您指出,outvalidateSession
可能应该是private
。您不需要初始化字段“closed”。@OldCurmedgeon Yea它应该是private,感谢您指出这一点