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

Java 这是使用单例的好理由吗?,java,android,singleton,Java,Android,Singleton,我正在制作一个安卓应用程序,它将有本地公交车的时刻表。 有不止一个时间表,使用的时间表取决于当天 如果是假期,我必须使用一个特别的时间表,所以我想知道什么时候是假期,什么时候不是 问题是,我正在创建一个类来处理这个问题,它将尝试从内存或web api检索信息。然后其他一些类将能够与这个类进行通信,但是我觉得没有必要拥有这个类的多个实例,我可以只创建一个实例并与其他类共享它 这个类是一个普通类还是创建一个普通类更好?单例类给您带来的一个主要好处是,您肯定有一个且只有一个执行某些操作的对象实例,并且

我正在制作一个安卓应用程序,它将有本地公交车的时刻表。 有不止一个时间表,使用的时间表取决于当天

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

问题是,我正在创建一个类来处理这个问题,它将尝试从内存或web api检索信息。然后其他一些类将能够与这个类进行通信,但是我觉得没有必要拥有这个类的多个实例,我可以只创建一个实例并与其他类共享它


这个类是一个普通类还是创建一个普通类更好?

单例类给您带来的一个主要好处是,您肯定有一个且只有一个执行某些操作的对象实例,并且它只实例化一次(最好是在应用程序的特定点,例如启动时或仅在执行某些其他操作后)

例如,一个缓存实现就是一个例子:您希望确保所有需要某个缓存的类都从同一个对象读写,这些对象可能在启动时创建并填充了信息

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

另一方面,如果您只需要一个具有某种方法的类来调用某些外部API或数据库,而不需要记住其中的任何信息,那么就没有理由初始化单例

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

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

因此,您的类将具有对类的静态引用

  • 不需要时,它将保存在内存中
  • singleton可能会被重新实例化,或者可能会使用过时的实例来创建新的活动。您将失去对当前变量的控制
  • 同一活动类的不同实例很可能与该类冲突
  • 同一活动类的多个实例化示例:

  • 更改设备方向
  • 从网络浏览器、Google Play和文件浏览器运行应用程序
  • 此外,在某个时候,当你添加基于用户评论的功能时,你的应用程序将会增长,你可能想要重构你的类,将它分解成子类,将它的一些方法放入单独的线程中。这将不再容易做到

    虽然这个应用程序很小,而且没有经过测试,但稍后,特别是在Android中,你会遇到一个不可预测且难以检测的错误的nightmite

    由于Android通过onCreate、onResume等特殊方式重新创建活动类,当应用程序开始过自己的生活时,你会遇到一场噩梦

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

    你可以在不同的方向之间切换,或者从不同的入口点(launcher、最近的应用程序、google play)运行你的应用程序,它可以重用为不同的活动实例化实际准备的变量


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

    思想是,当应用程序启动时,类加载信息,然后它永远不会更改。我会遇到同样的问题吗?如果您的类包含与活动相关的操作,那么很可能会出现这种情况(例如,与视图的交互、共享引用、弹出消息、文件i/o操作等)。您可以考虑所有情况,并将您的类保持在一个单一实例中,在所有情况下都避免活动上下文,但是,当您使用片段、其他活动时,您的类仍将保留在内存中。是否有理由不只是创建类的单个实例而不用担心?单一实例在扩展应用程序类时很好,但是这通常被认为是内存管理不足。