这是使用单例的好理由吗?

时间:2018-07-05 21:27:52

标签: java android singleton

我正在制作一个具有本地公交时刻表的Android应用。 时间表不止一个,要使用的时间表取决于一天。

如果是假期,我必须使用特殊的时间表,所以我想知道什么时候是假期,什么时候不是。

问题是我正在创建一个处理该问题的类,它将尝试从内存或Web api检索信息。然后,其他一些类也可以与此类进行通信,但是对我而言,似乎不必拥有一个以上的实例,我可以只创建一个实例并与其余的类共享。 >

这个类可以是Singleton吗?如果我创建一个普通的类会更好呢?

2 个答案:

答案 0 :(得分:1)

Singleton类为您带来的主要优点之一是,您可以确定一个对象在做某件事的情况下只有一个并且只有一个实例,并且该实例仅被实例化一次(最好是实例化)。在您应用程序的特定位置,例如在启动时或仅在执行某些其他操作之后)

例如,可能是一个缓存实现:您想要确保所有需要特定缓存的类都从同一对象读取和写入,而这些对象可能是在启动时创建并填充了信息。

您的情况似乎并非如此,除非您在启动应用程序时获取所需的信息,然后出于某种原因将其记住:在这种情况下,您要确保仅一次获取了您的信息,以避免浪费内存和时间。另外,如果您在实例化类时需要执行某种操作,例如打开连接然后保持打开状态,则Singleton也可以。

另一方面,如果您只需要一个带有某种方法的类来调用某些外部api或数据库,而无需记住其中的任何信息,则无需初始化单例。

如果这是您的情况,为什么不尝试一些静态的类/方法?可以像普通方法一样直接在类上调用它们,而无需实例化对象或保持状态,节省内存并避免副作用。

答案 1 :(得分:1)

在您的情况下(从内存中检索信息),绝对避免使用单例类,因为它很可能与您的Activity上下文相关联。

您的课程将对课程有一个静态引用,因此

  1. 在不需要时将其保留在内存中。
  2. 可能会重新实例化单一实例,或者可能会使用过时的实例,并增加新的活动。您将失去对当前变量的控制。 同一活动类的
  3. 不同实例极有可能与此类冲突。

同一活动类的示例具有多个实例化:

  1. 更改设备方向。
  2. 从网络浏览器的Google Play,文件浏览器意图中运行应用程序。

此外,在某些时候,当您基于用户评论添加功能时,您的应用程序将会增长,您可能希望重构您的类,将其分为子类,并将其某些方法放入单独的线程中。这将不再容易。

当应用程序较小且未经测试时,这似乎很有趣,但是后来,特别是在Android中,您将陷入难以预测且难以发现错误的噩梦。

由于Android通过onCreate,onResume等重新创建活动类的特殊方式,您将陷入噩梦,而该应用程序将开始自己的生活。

您将不再能够依靠当前单例实例实际上属于您当前活动的假设。

您可以在不同的方向之间切换,也可以从不同的切入点(启动器,最新的应用程序,Google Play)运行您的应用,并且它可以重新使用为不同的活动实例实际准备的变量。

如果只需要一个类的实例,只需在onCreate方法中创建该类的一个实例-这样会使该应用程序更易于管理。