【问题标题】:Should a (java/android) class that has a listner implemented in the constructor have static methods which are somehow related to the listner actions?在构造函数中实现了侦听器的(java/android)类是否应该具有与侦听器操作相关的静态方法?
【发布时间】:2012-04-09 12:22:01
【问题描述】:

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

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

  1. 我有一个处理设置和获取共享首选项的 Android 类 (MyPreferences)。
  2. 我在 MyPreferences 的构造函数中注册了一个自定义侦听器,该侦听器显示每次更改时更改的首选项。
  3. constructor 也有共同的东西: 设置 = 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

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

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

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

【问题讨论】:

    标签: java android static-methods


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

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

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

        顺便说一句,我考虑过使用静态初始化块来初始化settingseditor,但这不会起作用,因为getSharedPreferences 需要上下文。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-04-24
          • 2011-08-16
          • 2013-02-02
          • 2021-03-18
          相关资源
          最近更新 更多