0

好的,所以我会尽量让这个问题更简单一点。

这个问题的核心更多地是关于何时使用静态方法,但是在通过什么是静态方法与实例方法的要点理论概念之后,我想要一个更实用/实施建议,使用如下所述的现实世界问题。

  1. 我有一个处理设置和获取共享首选项的 andoid 类(MyPreferences)。
  2. 我在 MyPreferences 的构造函数中注册了一个自定义侦听器,它显示每次更改时更改的首选项。
  3. 构造函数也有共同的东西: settings = ctx.getSharedPreferences(MyConfig.NAME_SHARED_PREFERENCES, 0); 编辑器 = settings.edit(); settings.registerOnSharedPreferenceChangeListener(listener);

现在正如我之前提到的,MyPreference 有 10 个函数可以获取/更新共享首选项键...

public static void setPrefsIsAppEnabled(Boolean boolValue) {
        editor.putBoolean(MyConfig.PREFS_IS_APP_ENABLED, boolValue);
        editor.commit();            
}

public static boolean getPrefsIsAppEnabled()
{
    return settings.getBoolean(MyConfig.PREFS_IS_APP_ENABLED, false);
}

现在我使用静态方式(即 MyPreferences.getPrefsIsAppEnabled()

好吧,这显然会引发错误,因为没有调用具有共享首选项对象的初始化的构造函数。

我的问题:在访问 getter 和 setter 方法之前,让所有这 10 个方法都非静态并在我的项目中实例化 MyPreference 是否是一个更好的逻辑,或者我应该将构造函数中存在的代码移动到所有 setter/getter 函数中并重复在调用 MyPreferences 类的方法之前,它无处不在。请通过说明您建议该解决方案的原因来帮助我更清楚地理解。

我知道这是一个非常n00b的问题。请原谅我。我对 Java 很陌生,所以只是建立我的概念。

4

3 回答 3

1

您的方法显然是有状态的(因为它们需要访问编辑器字段),因此将它们实现为静态方法并不是一个好主意。相反,您应该使用类实例。(静态方法通常是无状态的效用函数,即当输入相同时它们的结果总是相同的)。

您可以每次都实例化一个新对象或实现单例模式。单例类只能实例化一次。提供了一个静态方法 (getInstance) 以便访问它。

于 2012-04-09T12:34:59.413 回答
0

如何使您的类single instance并使所有方法非静态并创建获取其实例的方法..

于 2012-04-09T12:26:16.870 回答
0

也许您不应该为首选项定义 getter/setter 方法:它们似乎是多余的。需要访问首选项的类可以调用 standardctx.getSharedPreferences(...)等。

您在标题中声称侦听器与静态方法相关联,但我认为从您所展示的内容来看并非如此。除非侦听器使用您的 getter/setter,否则它应该只使用标准方式来访问首选项。

更一般地说,我不确定您是否需要 MyPreferences 类。也许您可以在另一个类的某个构造函数或方法中注册侦听器。我还没有看到你的完整应用程序,所以我不确定它是否合适。查看您调用的位置new MyPreferences(),看看是否有一种方法可以代替。

顺便说一句,我考虑过使用静态初始化块来初始化settingsand editor,但这不起作用,因为getSharedPreferences需要一个 Context。

于 2012-04-09T13:19:24.003 回答