回顾这post enumerating several problems of using singletons

这两种机制有什么优点/缺点?

老实说,我希望在这篇Singleton pattern with Web application, Not a good idea!篇博文中给出同样的答案,但适用于Android.我说得对吗?DalvikVM有什么不同?

编者按:我想就涉及的几个方面发表意见:

  • 同步化
  • 可重用性
  • 测试

推荐答案

我非常不同意黛安娜·哈克伯恩的回答.我们正在一点一点地从我们的项目中删除所有单例,以支持轻量级、任务范围的对象,这些对象可以在您实际需要时轻松地重新创建.

对于测试来说,单例是一场噩梦,如果懒散地初始化,将引入"state indeterminism",并产生微妙的副作用(当将调用从一个作用域移动到另一个作用域时,可能会突然出现这种副作用).可见性被提到是另一个问题,由于单例意味着对共享状态的访问,当在并发应用程序中没有正确同步时,可能会出现细微的错误.

我认为它是一种反模式,它是一种糟糕的面向对象风格,本质上是维护全局状态.

回到你的问题:

尽管应用程序上下文本身可以被认为是单例的,但它是由框架管理的,并且具有定义良好的life-cycle、范围和访问路径.因此,我认为如果您确实需要管理app-global状态,它应该放在这里,而不是其他地方.对于其他任何事情,请重新考虑您的really是否需要一个Singleton对象,或者是否也可以重写Singleton类来实例化执行手头任务的短暂的小对象.

Java相关问答推荐

在Keycloak测试容器中的测试之间清理数据库

CriteriaQuery with max

如何使用Java API在Oracle ODI中运行模拟?

Java inline Double条件和值解装箱崩溃

';com.itextpdf.ext.html.WebColors已弃用

使用传递的参数构造异常的Mockito-doThrow(或thenThrow)

如何让DTO接受空字符串字段,但如果它们不为空,则应用JPA验证?

在Spring Boot应用程序中导致";MediaTypeNotSupportdException&qot;的映像上载

具有阻塞方法的开源库是否应该为执行提供异步选项?

Java构造函数分支

如何仅使用键/ID的一部分(组合)高效地返回映射值?

我如何为我的Java抵押贷款代码执行加薪操作(&Q)

使用SWIG将C++自定义单元类型转换为基本Java类型

Android无法在Java代码中调用Kotlin代码,原因是在Companion中使用Kotlin枚举时

Java中的发布/订阅-Long Live和Short Live Publisher,哪种方法是正确的?

Kotlin-仅替换字符串中最后一个给定的字符串

无法在Java中获取ElastiCache的AWS CloudWatch指标

如何在Spring Boot Auth服务器上正确配置CORS?

ControlsFX RangeSlider在方向垂直时滞后

始终使用Spring Boot连接mongodb上的测试数据库