【问题标题】:How long will singleton class object exist单例类对象会存在多久
【发布时间】:2017-09-20 14:56:03
【问题描述】:

我正在开发一个 android 应用程序,其中有一个单例类,如下所示:

public class ClassName {

    private static ClassName mobject;
    public List<Question> mquestionslist;

    public ClassName() {
        mquestionslist=new ArrayList<Question>();
    }

    public static ClassName getInstance() {
        if (mobject == null) {
            mobject = new ClassName();
        }
        return mobject;
    }
    public void LoadQuestions()
    {
       //do somthing

    }
}

现在每次我想使用这个对象时,我只需从其他活动或片段中调用 ClassName.getInstance().any_method_name() 并直接使用它。 我从不为此类对象创建任何本地引用,例如:

ClassName ref=ClassName.getInstance();
ref.any_method_name();

=>请告诉我这个对象在垃圾收集器从内存中删除之前可以存活多长时间,这是一个好习惯。 (无法从其他地方得到答案)

【问题讨论】:

  • 直到您的应用程序保留在内存中。
  • 不要对单例使用延迟初始化。类本身是延迟加载和初始化的。因此,只需将单例引用声明为 final 并在其声明中对其进行初始化。

标签: java android


【解决方案1】:

通过调用“getInstance”方法获得的实例是在“ClassName”类中定义的静态对象

 private static ClassName mobject;

在类 'ClassName' 保持加载状态之前,该实例将无法进行垃圾回收。

如果用于加载“ClassName”的类加载器被垃圾回收,则“ClassName”类将被卸载,相应的静态对象将丢失。

【讨论】:

  • @Amit P 如何克服这种情况,我已经问过问题stackoverflow.com/questions/43555695/…
  • "在类 ClassName 保持加载之前,该实例将无法进行垃圾回收。"你不是说“不再存在”吗?
  • @LewBloch 我在这里只想说实例将一直保留到类存在为止。可能我们俩读同一个句子的方式不同
【解决方案2】:

根据您提出的问题类型,您对设计模式的了解似乎有限。所以让我添加一些描述。

Read this document to know about different design patterns.

这个特定的链接有每个设计模式的定义和解释,请阅读一遍。下面我会提到几个的使用。

单身人士:
如果您只需要一个类的一个实例,则应该使用它。现在是什么让您决定只需要一个实例?
像下载多个文件这样的情况应该在一个线程中处理,所以下载管理器应该是单例的,像处理数据库这样的情况需要 ACID 实现,所以数据库处理程序应该是单例的。也就是说,如果你不想序列化你的操作,你不应该使用单例。

工厂:
工厂方法一般用在 Android 的 Fragments 中。原因?
假设您有一个 viewpager,其中 viewpager 中的内容类型与一些共同点不同,因此您可以在您的 super Fragment 中有一个通用的 newInstance 方法,在这里您可以处理逻辑来决定将哪个片段传递给 @ 987654323@ 基于位置和条件,这将简化您的代码,因为您将显示逻辑与功能逻辑隔离。 Factory 还允许您维护 Fragment 参数。

建造者:
当您有一个可以直接使用的类时,无需任何参数或通过修改单个参数。在这种情况下,您不能为每个参数组合使用构造函数,尽管您可以使用 setter 和 getter,但请考虑第一次初始化单个变量的情况。这里我们使用 Builder。例如 Glide 或 Picasso。

结论:
您必须熟悉目的,一旦您的目的非常明确,您就可以相应地选择设计模式。如果您在不知道其模式的情况下坚持一种类型的设计模式,那么您最终会使您的应用程序复杂化。 最重要的是,如果你遵循正确的设计模式,你的应用会自动变得高效,并且在大多数情况下你不需要担心内存和处理。

希望这将帮助您决定选择哪种模式。如果您想了解更多信息,请告诉我。我建议的一件事是提出您的确切要求 以便我或其他人可以为此目的提出最佳模式。

【讨论】:

  • 谢谢。这很有帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多