首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >单例或非单例。如何衡量?

单例或非单例。如何衡量?
EN

Stack Overflow用户
提问于 2014-09-30 15:09:08
回答 2查看 145关注 0票数 2

有时,您必须选择是使用singleton对象(真正的Singleton对象,还是像注入的bean那样的实际singleton对象),还是每次都使用new。你做什么实际上取决于对象。

如果创建一个对象需要一分钟时间和10MB内存,那么如果不需要的话,您不希望创建多个对象。但是,如果它只需要一毫秒和20字节的内存,谁会关心你是否在整个应用程序中创建了10个这样的内存,而且在我看来,单例的额外复杂性是不值得的。

但我想测量一下这个。我发现了一些使用Instrumentation包查看内存使用情况的选项,但使用起来似乎相当困难和繁琐。所以我想知道,在单元测试中,有没有什么很好的技巧可以用来获得一个对象的内存和计时属性的大概数字?

澄清一下:在这个上下文中使用单例,我的意思是:一个你只创建其中之一的对象。不是一个真正的单例,在那里你强制只有一个。

例如,我们使用resteasy来生成REST代理。你可以通过依赖注入获取代理:

代码语言:javascript
复制
@Bean
@Autowired
public AccountRequestResource accountsServiceClient(JaxRsProxyClientBuilder builder) {
    return builder.createProxy(AccountRequestResource.class, accountsServiceBaseUrl);
}

@Autowired
AccountRequestResource accountsServiceClient

或者,您可以在需要的地方为每个类构造一个新的类:

代码语言:javascript
复制
AccountRequestResource accountsServiceClient = 
builder.createProxy(AccountRequestResource.class, accountsServiceBaseUrl)

我想在一般情况下(不仅仅是resteasy,而是任何类型的注入对象)来衡量这些类型的问题。

EN

回答 2

Stack Overflow用户

发布于 2014-09-30 15:29:17

你之所以想让事情成为单例,通常并不是为了节省时间/内存。

假设您有一个维护DatabaseConnection池的类。您需要确保您只有其中一个,否则将使您的池增加一倍或三倍,并可能使数据库不堪重负。

类似地,您可能有一个缓存类,并且希望确保只有一个缓存副本,以便在应用程序中保持一致性。

在我看来,你不需要创建很多单例的小实例的事实是次要考虑的。

一般来说,在spring中注入的bean并不是真正的“单例”。它们只由容器实例化一次。没有什么可以阻止您执行new YourBean();,从而创建类的两个副本。真正的单例永远不会让您在同一个JVM中创建两个副本。

票数 2
EN

Stack Overflow用户

发布于 2014-09-30 15:34:05

您应该将项设置为单例的唯一原因是,只有一种可能。

这与以下事实无关:-创建时间-它使用的内存-在当前设计中只使用一个实例的事实。

关于最后一项:假设你制作了一个文本编辑器。你决定一个文档是单例的。但是,后来您认为拥有多个文档会更好……因此,在将实例设置为单例之前,请三思。单例只应该是单例,如果你知道现在和以后只会有一个实例(即使那样我也只是在需要从不同的点访问的时候才使用它)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26114782

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档