Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么在ThreadLocal中将ThreadLocalMap设计为静态嵌套类?_Java_Static - Fatal编程技术网

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

Java 为什么在ThreadLocal中将ThreadLocalMap设计为静态嵌套类?,java,static,Java,Static,为什么在ThreadLocal中将ThreadLocalMap设计为静态类?而静态和非静态嵌套类的区别如下 嵌套的静态类不需要外部类的引用,但非静态嵌套类或内部类需要外部类引用 内部类(或非静态嵌套类)可以访问外部类的静态和非静态成员。静态类无法访问外部类的非静态成员。它只能访问外部类的静态成员 如果没有外部类的实例,则无法创建内部类的实例,并且内部类可以引用它所嵌套的外部类中定义的数据和方法,因此我们不需要将对象的引用传递给内部类的构造函数。由于这个原因,内部类可以使程序变得简单和简洁 首先需

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

  • 嵌套的静态类不需要外部类的引用,但非静态嵌套类或内部类需要外部类引用

  • 内部类(或非静态嵌套类)可以访问外部类的静态和非静态成员。静态类无法访问外部类的非静态成员。它只能访问外部类的静态成员

  • 如果没有外部类的实例,则无法创建内部类的实例,并且内部类可以引用它所嵌套的外部类中定义的数据和方法,因此我们不需要将对象的引用传递给内部类的构造函数。由于这个原因,内部类可以使程序变得简单和简洁


  • 首先需要注意的是,
    ThreadLocalMap
    是一个包私有类,因此它不是API的一部分,而是一个实现细节,如有必要,在未来的JDK版本中可能会更改

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

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

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