有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java是否有任何方法可以监听对全局变量的更改以触发事件

Android,Java。是否有任何方法可以监听全局变量的更改以触发事件

例如,如果我在一个类中创建一个名为SeeMe的全局布尔变量。然后从第二个类将该全局布尔值更改为true

第一个听过这个变化的类是否可以执行Tryme()


共 (2) 个答案

  1. # 1 楼答案

    您不能在java中注册变量上的观察者-这是不可能的。我将研究方法——只需为全局变量创建setter和getter。有两种可能性:

    您必须为需要“监视”的每个类生成代理。此代理监视器只能有一个实现,您可以在多个类上注册它。例如,在JDK代理的情况下,您将实现方法invoke(Object proxy, Method m, Object[] args),并且代理类上的所有方法调用都将通过invoke(..)进行

    这样的解决方案有一个很大的优势:您正在监视的类不耦合到监视框架

  2. # 2 楼答案

    您想使用Observer Pattern

    您将在全局对象中实现Observable接口,然后为需要接收通知的每个类实现Observer接口

    在您的例子中,持有seeMe的变量将位于Observable的类中,并且seeMe的setter方法将在值更改时调用notify()。方法tryMe()将是Observer类的成员,并且在Observable更改时将接收对update()的调用

    下面是一个示例Observable

    import java.util.Observable;
    
    public class GlobalValues extends Observable {
    
        private static GlobalValues mInstance = null;
    
        public static GlobalValues getInstance() {
            if( mInstance == null )
                mInstance = new GlobalValues();
    
            return mInstance;
        }
    
        public enum ValueName { NONE, SEEME, OTHERVALUE };
    
        static class ValueKey {
            private ValueName mValueName;
    
            public ValueKey( ValueName valueName ) {
                mValueName = valueName; 
            }
    
            public ValueName getKey() { return mValueName; }
        }
    
    
    
        private boolean mSeeMe = false;
    
        public boolean getSeeMe() { return mSeeMe; }
    
        public void setSeeMe( boolean value ) {
            if( value != mSeeMe ) {
                mSeeMe = value;
                this.setChanged();
                this.notifyObservers( new ValueKey( ValueName.SEEME ) );
            }
        }
    
    }
    

    然后你会这样使用它:

    import java.util.Observable;
    import java.util.Observer;
    
    public class SampleObserver implements Observer {
    
        public void startObservingGlobals() {
            GlobalValues.getInstance().addObserver( this );
        }
    
        public void stopObservingGlobals() {
            GlobalValues.getInstance().deleteObserver( this );
        }
    
        public void doTryMe( boolean newSeeMe ) {
            // do something when seeMe changes
        }
    
        @Override
        public void update(Observable observable, Object object) {
            if( observable instanceof GlobalValues ) {
                if( object != null && object instanceof GlobalValues.ValueKey ) {
                    switch( ( (GlobalValues.ValueKey)object ).getKey() ) {
                    case NONE:
                        // General Notification
                        break;
                    case SEEME:
                        doTryMe( GlobalValues.getInstance().getSeeMe() );
                        break;
                    case OTHERVALUE:
                        // do something else
                        break;
                    }
                }
            }
        }
    
    }
    

    注意,它还通过getInstance()实现了一个全局单例模式,以及一种通过enum和包装器类识别哪些值发生了更改的方法