【问题标题】:Java Observer Update functionJava 观察者更新功能
【发布时间】:2012-12-16 12:35:46
【问题描述】:

我有一个实现观察者的类,当然需要有更新功能:

public void update(Observable obs, Object obj);

谁能解释一下这两个参数代表什么? Observable 当然是我的 observable,但是,我如何通过这个 Observable obs 对象访问我的 observable 字段? 什么是Object obj?

【问题讨论】:

    标签: java


    【解决方案1】:

    如果其他人在弄清楚如何发送第二个参数时遇到困难,正如 Nick 指出的那样:在 notifyObservers 方法调用中。

    在 Observable 中:

    private void setLicenseValid(boolean licenseValid) {
        this.licenseValid = licenseValid;
        setChanged();  // update will only get called if this method is called
        notifyObservers(licenseValid);  // add parameter for 2nd param, else leave blank
    }
    

    在观察者中:

    @Override
    public void update(Observable obs, Object arg) {
        if (obs instanceof QlmLicense) {
            setValid((Boolean) arg);
        }
    }
    

    请务必正确连接您的 Observable,否则您的更新方法将不会被调用。

    public class License implements Observer {  
        private static QlmLicense innerlicense; 
        private boolean valid;
        private Observable observable;
    
        private static QlmLicense getInnerlicense() {
            if (innerlicense == null) {
                innerlicense = new QlmLicense();
                // This is where we call the method to wire up the Observable.
                setObservable(innerlicense);  
            }
            return innerlicense;
        }
    
        public boolean isValid() {
            return valid;
        }
    
        private void setValid(Boolean valid) {
            this.valid = valid;
        }
    
        // This is where we wire up the Observable.
        private void setObservable(Observable observable) {
            this.observable = observable;
            this.observable.addObserver(this);  
        }
    
        @Override
        public void update(Observable obs, Object arg) {
            if (obs instanceof InnerIDQlmLicense) {
                setValid((Boolean) arg);
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      obs 是扩展Observable 并具有notifyObservers 方法的对象。您可以将obs 转换为扩展Observable 的对象,然后调用您需要的方法。 obj 是可选参数,可以传递给notifyObservers

      【讨论】:

      • 将 obs 转换为我的扩展类没有“危险”吗?
      • 视情况而定。如果您只将 Observer 添加到一个 Observable 中,它会被保存。如果你将一个 Observer 添加到多个不同的 Observable 中,你可以使用 instanceof 运算符来检查 obs 的类型。
      • 太棒了。我的观察者只有一个观察者,所以我想铸造会很好。非常感谢。
      【解决方案3】:

      观察者的update(Observable obs,Object obj)方法通过notifyObservers接收到(Observable中)发生变化的对象(第二个参数)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-08-04
        • 2016-11-28
        • 2013-03-26
        • 2018-01-14
        • 2014-10-20
        • 1970-01-01
        • 2017-06-04
        相关资源
        最近更新 更多