将数据保存在静态变量中是不好的做法吗?

时间:2013-11-04 18:00:21

标签: java android static

(之前可能会提出这个确切的问题。我无法通过搜索找到它。如果你发现它有重复标记。)

在Android应用程序中,在这些情况下将对象存储在静态字段中是不是很糟糕?

  1. 应用程序数据。在应用程序运行时将应用程序数据保存在类中的静态变量中是不是很糟糕?目前我将数据存储在我的Application类中的实例变量中。然后,需要数据的类可以从Application获得数据。
  2. Context等。存储Context(例如对ActivityApplication的引用)是不好的做法在静态领域?这可以在需要的类中使用,例如一个LayoutInflater或资源。目前,我将Context传递给需要它们作为参数的方法。

1 个答案:

答案 0 :(得分:16)

是的,是的。 :)

静态字段。过度使用静态字段存在很多问题。不仅它们通过有趣的边缘访问速度较慢,而且它们也很容易在一夜之间被Android破坏,并且通常很难检查它们的所有引用或用if填充你的getter / setter(sSomeStatic == null ){return new SomeStatic()}。可以将一个静态引用存储到一个名为(例如)ApplicationData的类中,你可以存储一些值,嘿,我们偶尔需要一些全局变量,但它很容易滥用它,每当我检查新的Android时我都会皱眉开发者的源代码。

是的,将您的Application实例存储为单例模式并使用它,但不要仅仅因为您可以执行YOURAPP.getInstance()而向Application实现添加200个静态字段.TomeLazyValueYouAddedHere();

这很糟糕。它会导致不良做法,并且比访问硬引用的好设计要慢。

我可以永远继续下去,但有很多关于此事的StackOverflow讨论(有些激烈!)。如果你在这里,我假设你要求经验;我在不同的项目中已经做了几年的Android,我的经验一直是静态越少越好。

现在上下文 ...哦上下文。不要将Context存储在硬引用中。或者你会泄漏记忆。活动引用了View和许多其他内容。如果您存储了Context,那么您将存储活动,并且事情会变得糟糕。学习传递上下文,尽可能使用应用程序上下文,如果需要传递它,那么就是出于很好的理由。大多数情况下,App上下文足以获取资源,字符串等。 如果您要存储Context,请始终存储context.getApplicationContext();永远不要存储静态活动上下文。您也可以谷歌这一点,StackOverflow有一些很好的答案。

如果您只能购买一本Android手册,请获取BNR一本。即使Android可能会不时发布新的SDK,这些概念完全有效,作者使用的模式是处理活动,上下文,碎片等的正确方法。

更新您的应用应如下所示:

public class YourApp extends Application {
   private static YourApp sInstance;
   public YourApp() {
      super();
      sInstance = this;
   }
   public static YourApp getInstance() {
      return sInstance;
   }
}

在这种情况下,是的,您将获得相同的应用程序上下文的静态引用。