在Android/Java中将全局对象实现为单例或数据类的优缺点



关于如何在Android/Java中实现全局变量有很多问题和答案。

因此,似乎可以实现单例或使用数据类本身的静态变量。

我即将开始一个更大的项目,我想从好的方面开始。

我只是不知道该用哪一个。

prosingleton/con Data Class

  • 被认为是"更干净"的方式(但我真的不知道为什么)
  • 确保始终只有一种表示
  • 创建一个新实例,如果旧的实例被"清除"(无论何时可能发生?)

consingleton/pro Data Class

  • 不被一些人推荐(但没有找到令人信服的理由)
  • 确保通过设计只有一种表示
  • 非常容易通过编写MyDataClass访问。
  • 不需要作为参数传递

所以总的来说,我倾向于使用DataClass,但我不确定,因为我读到这应该不是好的编程风格

我喜欢添加

  • 这个全局对象必须持有的数据非常大,超过30,000个字符串/键。这不应该在任何阶段清理,以便当应用程序返回时,它可能会崩溃,因为我在其他地方读如单例vs.应用程序上下文在Android?(第三个答案)
  • 这不是一个web应用程序,我只使用一个类加载器
  • 它是多线程的,但是实际上只有一个线程在访问这个数据
  • 当然也可以使用这种方法如何在Android中声明全局变量?,但是在这种情况下,ObjectClass不是更容易使用和访问吗?
  • 检查此http://developer.android.com/resources/faq/framework.html,特别是在"持久对象"下,意味着在这些情况下无论如何都没有真正的优势。

多谢

实现单例的最好方法是使用enum。

public enum Singleton
{
    INSTANCE;
    public void someMethod()
    {
        // your code here
    }
}

有关详细信息,请参阅Effective Java(第二版)

首先:具有公共静态成员变量的类与单例类之间没有太大区别。许多开发人员更喜欢单例模式,因为它的代码看起来更自然,更Java化。例如,Singleton.Data看起来像一个常量访问,而Singleton.getData()看起来像你正在访问某种静态数据。

我个人使用静态应用程序模式:参见在没有活动或上下文引用的情况下访问资源

您可以使用onCreate来设置任何类型的静态数据甚至其他单例。例如,我更喜欢这样设置一个单例SQLite数据库,然后通过App.getDb()访问它。您可以使用此模式访问应用程序上下文或资源。

在使用静态数据时,应该考虑内存问题。我建议你去看看这篇文章。

最新更新