Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.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 为什么喜欢静态成员类而不是非静态成员类(Joshua Bloch项目#22)?_Java_Design Patterns - Fatal编程技术网

Java 为什么喜欢静态成员类而不是非静态成员类(Joshua Bloch项目#22)?

Java 为什么喜欢静态成员类而不是非静态成员类(Joshua Bloch项目#22)?,java,design-patterns,Java,Design Patterns,读了两遍这本书的那一部分后,我仍然不明白为什么这么笼统地说。 非静态成员类是该语言的一部分。同意并不是任何编程语言的所有部分都是完美的。非静态成员类访问封闭实例的方法的优势是否很少超过可能增加的代码复杂性(内部类和外部类之间更紧密的耦合。顺便说一句:静态成员类也可以访问外部类的字段,只要外部类也是静态的)?这本书的这一部分没有给出任何反对意见 适配器模式的非静态成员类呢?建筑模式 小对象的非静态成员类(类似于C++的struct)如何保存属于同一个类和属于外部类的一些数据位(因此没有理由使它们成

读了两遍这本书的那一部分后,我仍然不明白为什么这么笼统地说。 非静态成员类是该语言的一部分。同意并不是任何编程语言的所有部分都是完美的。非静态成员类访问封闭实例的方法的优势是否很少超过可能增加的代码复杂性(内部类和外部类之间更紧密的耦合。顺便说一句:静态成员类也可以访问外部类的字段,只要外部类也是静态的)?这本书的这一部分没有给出任何反对意见

适配器模式的非静态成员类呢?建筑模式

小对象的非静态成员类(类似于C++的struct)如何保存属于同一个类和属于外部类的一些数据位(因此没有理由使它们成为静态的)


(这里似乎有约书亚·布洛赫(Joshua Bloch)在《有效的Java第二版》中的大量摘录:-以防万一,我想知道我的出发点是什么)。

您的担忧在本书的第22项中得到了明确的阐述

为什么喜欢静态成员类而不是非静态成员类(Joshua Bloch项目#22)

答复:

如果声明的成员类不需要访问封闭 实例中,始终将静态修饰符放入其声明中,使其成为静态成员类而不是非静态成员类。如果省略此修饰符,每个实例都将有一个对其封闭实例的无关引用。存储此引用需要花费时间和空间,并且可能导致封闭实例在符合垃圾收集条件时被保留(第6项)。如果您需要在没有封闭实例的情况下分配实例,您将无法这样做,因为非静态成员类实例需要有封闭实例


适配器模式的非静态成员类呢?建筑模式

答复:

非静态成员类的一个常见用途是定义一个适配器[Gamma95,第139页],该适配器允许将外部类的实例视为某个不相关类的实例。例如,
Map
接口的实现通常使用非静态成员类来实现它们的集合视图,这些视图由
Map
键集
入口集
方法返回。类似地,集合接口的实现,例如
Set
List
,通常使用非静态成员类来实现其迭代器:

// Typical use of a nonstatic member class
public class MySet<E> extends AbstractSet<E> {
    ... // Bulk of the class omitted

    public Iterator<E> iterator() {
        return new MyIterator();
    }

    private class MyIterator implements Iterator<E> {
        ...
    }
}
//非静态成员类的典型用法
公共类MySet扩展了抽象集{
…//省略了类的大部分
公共迭代器迭代器(){
返回新的MyIterator();
}
私有类MyIterator实现了迭代器{
...
}
}

他没有提到与非静态类所需的外部实例引用相关联的空间/时间开销吗?如果Bloch自己没有给出一个可接受的理由,那么就没有理由遵循他的建议。“摘录”要么是剽窃,要么是未经引用的第三方评论。@EJP:我不打算评论未知人物发表的内容。这个链接就是我在谷歌上找到的答案。我写这篇文章是为了方便读者。我的怀疑与他原著(2dn版)中的J.B.文本有关。说支持静态嵌套类而不是内部类并不是太“宽泛”。它并不谴责内部类的使用,只要求完全理解它们的用例。它不需要一个“使[嵌套类型]成为静态的理由”,相反,它需要一个不这样做的理由。另一件事,包含类只能是静态的,如果它们也是嵌套的,并且双重嵌套类型是不好的。这个答案是正确的。然而,它完全是由OP已经阅读的材料组成的,因此它并没有真正添加任何内容(更清楚地说,这是一个关于问题的陈述,而不是答案:)@OliverCharlesworth我没有看到我在他的链接中引用的第一段(老实说,我没有通读所有的文本,我只是回答了).谢谢你的评论。user1803551强调了这里的关键段落。只是第22项的标题似乎与它们不匹配/不概括。我觉得@EJP指出了一点:如果写的东西没有很好的基础,不要盲目地跟随它(或者在这种情况下:不要只依赖粗体的标题,把文本作为一个整体对待)。不幸的是,他没有将自己简洁的话语扩展到一个被接受的答案上。@ArturOpalinski第22项实际上是对嵌套类的一个简短回顾,其中大部分是关于静态和非静态成员类的。EJP的评论无关紧要,因为布洛赫确实给出了遵循其建议的确切理由。这个答案正好回答了这个问题(尽管我只是引用了他的书)。@ArturOpalinski你不想接受这个答案有什么原因吗?