Java 制作';静态';类可观测

Java 制作';静态';类可观测,java,android,static,observable,observers,Java,Android,Static,Observable,Observers,我有一个带有静态方法的类Settings,用于保存和加载数据。例如,这是Save()方法: public static void Save(SETTING_KEY key, String value) { SharedPreferences sp = _context.getSharedPreferences(prefName, Context.MODE_PRIVATE); SharedPreferences.Editor editor = sp.edit(); edi

我有一个带有静态方法的类
Settings
,用于保存和加载数据。例如,这是
Save()
方法:

public static void Save(SETTING_KEY key, String value)
{
    SharedPreferences sp = _context.getSharedPreferences(prefName, Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = sp.edit();

    editor.putString(key.toString(), value);
    editor.commit();    
}
现在我想让类
设置
可见。问题是从Observable扩展我的设置类不起作用,因为我没有实例化这个类,因为我只使用它的静态方法

class Settings extends Observable {
    private static Settings instance;
    private static synchronized Settings getInstance() {
        if(instance == null) {
            instance = new Settings();
        }
        return instance;
    }

    public static void Save(SETTING_KEY key, String value)
    {
        SharedPreferences sp = _context.getSharedPreferences(prefName, Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sp.edit();

        editor.putString(key.toString(), value);
        editor.commit();
        getInstance().notifyObservers(value); // or whatever
    }

    // can't override addObserver with a static method, so make a new method instead
    public static void addObserverStatic(Observer observer) {
        getInstance().addObserver(observer);
    }
}

有什么简单的方法可以让这个静态类可见吗?

您可以尝试使用单例模式?()


这样,您就可以扩展observable。

添加您自己的观察者机制。下面是简单的实现

public interface Observer {
    void onSettingsChanged(String key, String value);
}

private static Observer observer;
public static void setObserver(Observer observer_) {
    observer = observer_;
}

public static void Save(SETTING_KEY key, String value) {
    SharedPreferences sp = _context.getSharedPreferences(prefName, Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = sp.edit();

    editor.putString(key.toString(), value);
    editor.commit();
    if (observer != null) {
        observer.onSettingsChanged(key, value);
    }
}

如果需要1个以上的列表,还可以使用
列表
,还可以使用某种类型的事件总线()系统来发布事件,而无需提供直接观察者机制。

您可以将单例与静态方法相结合

class Settings extends Observable {
    private static Settings instance;
    private static synchronized Settings getInstance() {
        if(instance == null) {
            instance = new Settings();
        }
        return instance;
    }

    public static void Save(SETTING_KEY key, String value)
    {
        SharedPreferences sp = _context.getSharedPreferences(prefName, Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sp.edit();

        editor.putString(key.toString(), value);
        editor.commit();
        getInstance().notifyObservers(value); // or whatever
    }

    // can't override addObserver with a static method, so make a new method instead
    public static void addObserverStatic(Observer observer) {
        getInstance().addObserver(observer);
    }
}

正如其他人所说,单例上的静态方法有点淘气。如果可以的话,用其他方法来做。

静态和遗传的概念在同一个计划中并不起作用。但这并不妨碍你列出观察者名单,并在你做某事时通知他们