用于状态管理的静态变量

时间:2018-10-11 15:32:53

标签: android kotlin static state

在这种情况下,我很难理解问题。

我有一个用于Google Analytics(分析)跟踪的类,我们称其为FlurryTracker, 它有2种方法StartTrackingScreen(ScreenName)StopTrackingScreen()

现在,如果我有一个名为screenName的静态变量,并且每次启动跟踪屏幕都称为screenName,则会重新分配。

startTrackingScreen(activity: Activity, screen: DhTracker.Screen<T>) {
        screenName = screen.getName()
        val lastScreen = Singleton.getLastScreen()
        //If last screen is not same as current screen

            FlurryAgent.logEvent(screenName, true)

    }
}


override fun stopTrackingScreen() {
    //New screen will start tracking before lastScreen tracking is stopped.
    if (enabled) {
        FlurryAgent.endTimedEvent(Singleton.getLastScreen()?.getName())
    }
}

companion object{
  lateinit var screenName : String
}

这些方法在应用本身的onStart()onStop()中被调用。

这么说,我们一次只跟踪一个屏幕,因为当用户转换到新屏幕时,将调用onStop()onStart()

因此,即使screenName是静态的,每次调用生命周期方法时,都会重新分配该静态var。由于一部手机不能同时运行2个活动,因此一次只能有1个跟踪器实例处于活动状态。

虽然我知道最佳实践表明应该为每个新实例创建screenName,但我在这里并没有真正看到使用静态方法的问题。我看错了方向吗?

1 个答案:

答案 0 :(得分:0)

您可以做到。

类似这样的两个主要模式是静态变量和方法或单例(这通常是静态的,因此您可以从不同路径使用它而无需传递它)。这两种方法在功能上都是相同的。

静态类的底片是:

  • 由于必须替换静态方法,因此难以测试
  • 难以创建第二个实例
  • 如果您决定要尝试,则很难通过(某些人喜欢知道给定路径用于测试目的的类)

这些还不错,您可以和他们一起生活-但是,如果您使用单身人士,那么这些问题都不存在。您可以轻松地将其传递,更改其行为,将其转换为使用注入而不是单例模式,…

所以我无法真正提出使用静态方法的理由,没有任何优势。