代码之家  ›  专栏  ›  技术社区  ›  Jeremy

如何“禁用”Java对象?

  •  0
  • Jeremy  · 技术社区  · 11 年前

    我有这样一节课:

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

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

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

    4 回复  |  直到 11 年前
        1
  •  2
  •   stoooops    11 年前

    在java类库中没有禁用调用。

    您应该创建 State 枚举,并在每个方法开始时将其作为防御编程进行检查。然后,你的类就变成了一个有限状态机,在这里你在某些状态下做某些事情。因此,您可能会被实例化,然后打开,然后关闭,等等。这些信息可以被编码在 状态 enum,它是灵活的,可以随时更改。

    例如,

    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
  •   Gabe Sechan    11 年前

    所有者让它超出范围。这是标准机制。然后,在所有makeCall函数中编写if语句,作为防御编程(根据原理,您可以主张使用断言)。

        3
  •  2
  •   gordonk    11 年前

    据我所知,您只能使用标志来做类似的事情,但是您可以将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 ).

        4
  •  0
  •   Ankur Shanbhag sachin garg    11 年前

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

    希望这能有所帮助。