有时你必须决定使用Singleton对象(一个真正的单例,或者只是一个事实上的单例,如注入的bean),或者每次只使用new。你的所作所为取决于对象。
如果一个对象需要一分钟来创建和10MB内存,如果没有必要,你不想创建多个。但是,如果只需要一毫秒和20个字节的内存,谁会在你的整个应用程序中创建10个内存,而单身人士的额外复杂性在我看来是不值得的。
但我想衡量一下。我找到了一些使用Instrumentation包来查看内存使用情况的选项,但这似乎很难并且使用起来很麻烦。所以我想知道,有一些很好的技巧我可以使用,例如在单元测试中,只是为了得到关于对象的内存和定时属性的球场图?
澄清:在这个上下文中使用单例我的意思是:你只创建一个对象。不是一个真正的单例,你强制只有一个。
例如,我们使用resteasy来生成REST代理。您可以通过依赖注入来获取代理:
@Bean
@Autowired
public AccountRequestResource accountsServiceClient(JaxRsProxyClientBuilder builder) {
return builder.createProxy(AccountRequestResource.class, accountsServiceBaseUrl);
}
@Autowired
AccountRequestResource accountsServiceClient
或者您可以为您需要的每个班级构建一个新的:
AccountRequestResource accountsServiceClient =
builder.createProxy(AccountRequestResource.class, accountsServiceBaseUrl)
我想在一般情况下测量这些问题(不仅仅是重复,而是任何类型的注入对象)。
答案 0 :(得分:2)
你想要制作单身的原因通常不是为了节省时间/内存。
假设您有一个维护 DatabaseConnection 池的类。您需要确保只有其中一个,否则您将使您的池加倍/三倍,并可能压倒数据库。
同样,您可能有一个缓存类,并且您希望确保只有一个缓存副本,以便您在应用程序中保持一致。
在我看来,您不需要创建大量小单例的事实是次要的考虑因素。
一般来说,春天注入的豆子并不是真正的“单身人士”。它们只是由容器实例化一次。没有什么能阻止你做new YourBean();
,从而创建了两个类的副本。 true singleton 永远不会让你在同一个JVM中制作两个副本。
答案 1 :(得分:1)
你应该让一个单项成为单身的唯一原因是,只有一个可能。
这与以下内容无关: - 创建所需的时间 - 它使用的内存 - 您只在当前设计中使用一个实例。
关于最后一项:假设您制作文本编辑器。您确定文档是单例。但是,稍后您认为拥有多个文档会很好...所以在将实例设为单例之前要三思而后行。单身人士应该只是单身人士,如果你知道现在和以后只有一个实例(即使那时我只在我需要从各个点访问时使用它)。