草庐IT

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

coder 2023-11-23 原文

在 Android 应用程序中,在这些情况下将对象存储在静态字段中是否是一种不好的做法?

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

最佳答案

是的,是的。 :)

静态字段。过度使用静态字段会带来很多问题。它们不仅访问速度较慢,而且很容易被 Android 在一夜之间破坏,而且到处检查它们的引用或用 if (sSomeStatic == null) { 返回新的 SomeStatic()}。可以存储对一个名为(例如)ApplicationData 的类的静态引用,你可以在其中存储一些值,嘿,我们时不时需要一些全局变量,但它很容易被滥用,每次检查新的 Android 时我都会皱眉开发人员的源代码。

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

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

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

现在是上下文……哦是上下文。永远不要将 Context 存储在硬引用中。否则你会泄漏内存。一个 Activity 引用了 View 和许多其他东西。如果您存储上下文,那么您将存储 Activity ,然后事情就会变得糟糕。学习传递 Context,尽可能使用 Application Context,如果你需要传递它,那么这样做是有充分理由的。大多数情况下,App 上下文足以获取资源、字符串等。 如果您要存储上下文,请始终存储 context.getApplicationContext(); 永远不要存储静态 Activity 上下文。你也可以用谷歌搜索这个,StackOverflow 有一些很好的答案。

如果您买得起一本且只有一本 Android 书籍,请购买 BNR一。尽管 Android 可能会不时发布新的 SDK,但这些概念是完全有效的,作者使用的模式是处理 Activity 、上下文、 fragment 等的正确方法。

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

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

在那种情况下,是的,您将获得对相同 App Context 的相同静态引用。

关于java - 将数据保存在静态变量中是不好的做法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19774075/

有关java - 将数据保存在静态变量中是不好的做法吗?的更多相关文章

  1. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  2. ruby-on-rails - 如何使用 instance_variable_set 正确设置实例变量? - 2

    我正在查看instance_variable_set的文档并看到给出的示例代码是这样做的:obj.instance_variable_set(:@instnc_var,"valuefortheinstancevariable")然后允许您在类的任何实例方法中以@instnc_var的形式访问该变量。我想知道为什么在@instnc_var之前需要一个冒号:。冒号有什么作用? 最佳答案 我的第一直觉是告诉你不要使用instance_variable_set除非你真的知道你用它做什么。它本质上是一种元编程工具或绕过实例变量可见性的黑客攻击

  3. ruby - 通过 ruby​​ 进程共享变量 - 2

    我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是

  4. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  5. ruby-on-rails - 如何在我的 Rails 应用程序 View 中打印 ruby​​ 变量的内容? - 2

    我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby​​中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R

  6. ruby - Ruby 有 `Pair` 数据类型吗? - 2

    有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳

  7. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  8. ruby-on-rails - 使用 ruby​​ 将多个实例变量转换为散列的更好方法? - 2

    我收到格式为的回复#我需要将其转换为哈希值(针对活跃商家)。目前我正在遍历变量并执行此操作:response.instance_variables.eachdo|r|my_hash.merge!(r.to_s.delete("@").intern=>response.instance_eval(r.to_s.delete("@")))end这有效,它将生成{:first="charlie",:last=>"kelly"},但它似乎有点hacky和不稳定。有更好的方法吗?编辑:我刚刚意识到我可以使用instance_variable_get作为该等式的第二部分,但这仍然是主要问题。

  9. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

  10. ruby-on-rails - rspec - 如何检查方法是否存在? - 2

    我的模型有defself.empty_building//stuffend我怎样才能对这个现有的进行rspec?,已经尝试过:describe"empty_building"dosubject{Building.new}it{shouldrespond_to:empty_building}endbutgetting:Failure/Error:it{shouldrespond_to:empty_building}expected#torespondto:empty_building 最佳答案 你有一个类方法self.empty_bu

随机推荐