【问题标题】:How to "disable" a Java object?如何“禁用”Java 对象?
【发布时间】:2013-03-20 20:00:32
【问题描述】:

我有这样的课:

public class DatabaseSession {

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

}

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

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

【问题讨论】:

  • 如你所说,使用状态标志,在方法开始时检查其状态,并根据需要抛出异常。我能想到的任何技术基本上都以相同的方式工作,检查、运行/投掷
  • 您可以在私有方法中编写 if 语句并调用它,而不是在每个方法的开头编写 if 语句。
  • @Ozzie - 并从那里抛出异常。然后可以将其称为ensureOpen()
  • @OldCurmudgeon 这正是我的意思:)

标签: java database invalidation


【解决方案1】:

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】:

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

    【讨论】:

      【解决方案3】:

      据我所知,您只能使用标志来执行类似的操作,但是您可以将 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)。

      【讨论】:

      • validateSession 应该是private
      • 你不需要初始化字段“关闭”。
      • @OldCurmedgeon 是的,它应该是私人的,感谢您指出这一点
      【解决方案4】:

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

      希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-01-13
        • 2016-12-23
        • 2012-08-28
        • 2023-02-08
        • 2020-10-21
        • 2022-01-02
        • 2023-03-08
        • 1970-01-01
        相关资源
        最近更新 更多