singleton - 为什么要使用 Application 子类来保存全局变量?

标签 singleton global-variables android

在我的应用程序中,我使用公共(public)类 Globals 来保存我在整个应用程序中设置和获取的静态变量,只需通过 p.e. 引用它们即可。 Globals.someString:

public class Globals {
    // several static variables for use in the whole application:
    static String someString = "";
}

我的应用似乎运行良好。但现在我到处都读到全局变量应该在 Application 的子类或自己的单例类中定义,并由 setter 和 getter 访问。

我现在的问题是:我自己使用全局变量的方式有什么缺点吗?内存泄漏还是其他问题?

最佳答案

两部分答案:

第一部分:神话与理论

一般来说,在面向对象中,不建议使用静态全局变量,因为它非常难以控制。这就是将 Singleton 与 getters/setters 一起使用的建议的来源。这是一个更可控的可管理环境。但是,如果您是该应用程序的唯一开发人员并且不介意它。这确实是最佳做法,并不是应用正常运行所必需的。

子类 Application 或拥有自己的公共(public)类,如果您使用的只是字符串、int 等,都没有什么区别。如果您正在初始化对象,则在 Internet 上对应用程序进行子类化是很常见的事情需要上下文,例如数据库。我个人不太喜欢这种方法。它会减慢启动时间,并且可能会在内存中保留我并不真正需要的大对象。对于这些类型,我通常会进行惰性初始化,其中我持有我的应用程序的 public static 引用,并且每当我调用时,例如 MyDatabase.get(); 内部get() 我检查 if(instance==null) 然后使用公共(public)可访问的 Application 对象初始化它。

如果您在 Android 中保留 Activity、Fragment 或 View 对象的静态引用,您将不可避免地遇到内存问题。这些类很大,它们包含对其他大对象的引用,它们使用大量内存,这就是为什么框架具有所有烦人的 life-cyclesaveState 的原因。因此,它们可以在需要内存时销毁,并在它们重新出现在屏幕上时重建。

第二部分:Android方式

在 Android 中,仅将对象引用保留在 public static 上是不太可取的,因为它们将永远保留在内存中,而且手机不像具有 TB RAM 的网络服务器。整个 Android 框架有一个很好的记录和稳定的结构,通过 Bundle 对象传递和保存值(字符串、整数等)。您可以通过 Intent 传递给 Activity,或通过 setArguments(Bundle) 传递给 Fragments 的那些包,它们可用于使用 onSavedInstanceState 保存当前状态方法。这些都是以 Android 方式做事的可取方式。它还有助于促进类分离,即使对于小型项目来说,这听起来像是很多工作,但对于更大的项目来说,这是保持结构和组织的方法之一。

关于singleton - 为什么要使用 Application 子类来保存全局变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25621151/

相关文章:

Php:单例VS全静态类?什么时候用什么?

.net - 单例与否

javascript - 使用 javascript 记住用户在前几页所做的选择?

c - 如何声明一个只存在于一个函数中的全局变量?

android - 如何将数据从android应用程序发送到客户端的数据库?

design-patterns - 应用程序设置管理器的单例模式的替代方案

c# - 单例实现

php - 如何声明全局变量并初始化

android - 在android中检测网络类型(TelephonyManager)的变化

java - 避免将 null 作为参数传递给构造函数