使“静态”类可观察

时间:2014-01-20 23:20:45

标签: 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();

    editor.putString(key.toString(), value);
    editor.commit();    
}

现在我想让类Settings可观察。问题是从Observable扩展我的Settings-class不起作用,因为我没有实例化这个类,因为我只使用它的静态方法。

有没有简单的方法可以使这个静态类可观察?

3 个答案:

答案 0 :(得分:2)

添加自己的观察者机制。

下的简单实现
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,也可以使用List<Observer>,并且还可以使用某种事件总线(e.g. Otto)系统来发布事件,而无需提供直接的观察器机制。 / p>

答案 1 :(得分:1)

您可以尝试使用Singleton模式吗? (Java Singleton Pattern

这样,你可以扩展observable。

答案 2 :(得分:0)

您可以将单例与静态方法结合使用。

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);
    }
}

正如其他人所说,单身人士的静态方法有点顽皮。如果可以,请以其他方式做。

相关问题