【问题标题】:Alternate to singleton in android在android中替代单例
【发布时间】:2018-02-04 04:59:10
【问题描述】:

作为软件架构工作多年,我讨厌在可以避免使用单例的情况下使用它们。但是当单例似乎是唯一的选择时,我不得不为 android 应用程序做一些任务。可能有人可以提出其他建议吗?

任务是创建一个 UI 向导来创建一些新实体(在我的例子中是行程描述)。实体很复杂,需要多个页面来完成其所有数据。

当用户进入下一页时,向导被组织为一个接一个地推回堆栈的几个片段。但是所有片段都应该与编辑实体的一个实例一起使用。当重新创建活动时(在轮换或其他情况下),该实体应该保持活动状态。如果页面只有一个,我可以在 onSaveInstanceState 中保存/恢复实体。但是,如果我将在我的向导的所有片段中这样做,所有片段都将拥有自己的实体实例(因为它们都保存它然后恢复)。并且向导会出错(例如,当您导航回以前的页面时)。

为了更痛苦,假设拥有此片段的活动不应该知道有关此特定向导的任何信息,并且我不会将任何特定于此向导的代码放入活动中。在我的情况下,禁用活动也不是一种选择。

所以在这种情况下,显而易见的解决方案是创建包含我的编辑实体的单例。并使所有的向导片段都与这个单例一起工作。毫无疑问,我 90% 的程序员都会选择这样的解决方案。但我的大脑反对它。当实体本质上不是单例时,为什么我应该将其设为单例???

因此,如果有人可以提出不同的建议,我将不胜感激。

【问题讨论】:

  • “服务”在android方面?

标签: android android-fragments architecture singleton


【解决方案1】:

假设您有以下内容:

  • 应用类;
  • 向导管理器;
  • SomeWizardDataEntity;

您可以在 Application 类中创建 WizardManager 并将其与数据实体一起用于您的向导流程,即:

//BaseFragment:
WizardManager manager = getApplication().getWizardManager();
SomeWizardDataEntity entity = manager.getWizardEntity();

//Fragment1:
entity.addSomeData();

//Fragment2:
entity.addSomeData2();

//Fragment3:
entity.addSomeData3();

//Fragment4:
entity.addSomeData4();
manager.wizardFlowFinihed();

因此,您将拥有 WizardManager 的非单例实例,该实例将一直存在到 Application 类活跃为止。

然后你可以写一些测试来模拟这个实体,即:

@Mock
WizardManager mWizardManager;

//start some fragment

verify(entity, times(1)).addSomeData();
verify(manager, times(1)).wizardFlowFinihed();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-30
    • 1970-01-01
    • 2010-11-21
    • 1970-01-01
    相关资源
    最近更新 更多