Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何";禁用";Java对象?_Java_Database_Invalidation - Fatal编程技术网

如何";禁用";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,感谢您指出,out
validateSession
可能应该是
private
。您不需要初始化字段“closed”。@OldCurmedgeon Yea它应该是private,感谢您指出这一点