如何“禁用”Java对象?

时间:2013-03-20 20:00:33

标签: java database invalidation

我有一个这样的课程:

public class DatabaseSession {

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

}

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

我可以在每个方法的顶部使用if语句执行此操作,但这很容易忘记编写。用什么标准机制来说“这个对象现在没用了。你不能再打电话了。”?

4 个答案:

答案 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方法)。

希望这会有所帮助。