首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在ThreadLocalMap中将ThreadLocal设计为静态嵌套类?

问为什么在ThreadLocalMap中将ThreadLocal设计为静态嵌套类?
EN

Stack Overflow用户
提问于 2016-01-14 03:25:10
回答 1查看 766关注 0票数 0

为什么在ThreadLocalMap中将ThreadLocal设计为静态类?而静态类和非静态嵌套类在下面有区别。

  1. 嵌套静态类不需要外部类的引用,但非静态嵌套类或内部类需要外部类引用。
  2. 内部类(或非静态嵌套类)可以访问外部类的静态成员和非静态成员。静态类不能访问外部类的非静态成员.它只能访问外部类的静态成员。
  3. 如果没有外部类的实例,就不能创建内部类的实例,而内部类可以引用其嵌套的外部类中定义的数据和方法,因此我们不需要将对象的引用传递给内部类的构造函数。因此,内部类可以使程序简单、简洁。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-14 04:04:15

首先,应该指出,ThreadLocalMap是一个包私有类,因此它不是API的一部分,而是一个实现细节,如果必要的话,这些细节在未来的JDK版本中可能会改变。

为什么不是非静态的?仅仅因为非静态嵌套类(内部类)绑定到外部类的具体实例。在我们的例子中,它应该绑定到具体的ThreadLocal变量。这是错误的:ThreadLocalMap被绑定到线程,并存储给定线程的所有ThreadLocal变量的所有值。因此,将其绑定到具体的ThreadLocal实例是毫无意义的。

也许让ThreadLocalMap成为Thread类的内部类看起来更符合逻辑。然而,ThreadLocalMap只是不需要Thread对象来操作,因此这只会增加一些不必要的开销。它位于ThreadLocal类中的原因是ThreadLocal负责创建ThreadLocalMap。只有在此线程中设置了第一个ThreadLocalMap时,才为当前线程创建ThreadLocal,但在此之后,对所有其他ThreadLocal变量使用相同的ThreadLocalMap。

另一种选择是将ThreadLocalMap保存为单独的包-- java.lang包中的私有类。这种选择没有什么问题:这只是品味问题,取决于开发人员更想要什么:将相关功能分组到单个源文件中,或者使源文件长度保持较小。

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

https://stackoverflow.com/questions/34781183

复制
相关文章

相似问题

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