问题标签 [effective-java]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
6 回答
220 浏览

java - 为什么这个通用方法调用不起作用?

以下代码来自 Effective Java book :

这段代码没有编译,作者建议通过告诉编译器确切的类型来解决这个问题,如下所示:

如果联合的签名如下,为什么早期的程序不能编译?这个特殊的解决方法叫什么?

0 投票
3 回答
627 浏览

java - Joshua Bloch 所说的超语言是什么意思?

从这篇关于克隆与复制构造函数的 Artima 文章

Object 的 clone 方法非常棘手。它基于现场副本,并且是“语言外的”。它创建一个对象而不调用构造函数。不能保证它保留了构造函数建立的不变量。多年来,无论在 Sun 内部还是外部,都出现了很多错误,这是因为如果您只是在链上反复调用 super.clone 直到您克隆了一个对象,您就会得到该对象的浅表副本。

Joshua Bloch所说的外语是什么意思?

0 投票
3 回答
1343 浏览

java - 有效的 Java 项目 17:重写 removeRange() 如何提高性能?

在 Joshua Bloch 的《Effective Java》一书中,讨论了一个类如何提供“明智选择的受保护方法”作为其内部工作的挂钩。
然后作者引用了以下文档AbstractList.removeRange()

此方法由clear对该列表及其子列表的操作调用。重写此方法以利用列表实现的内部结构可以显着提高clear对该列表及其子列表的操作性能。

我的问题是,重写此方法如何提高性能(不仅仅是不重写它)?谁能举个例子?

0 投票
1 回答
165 浏览

java - 终结者,关闭文件和流

在 Joshua Bloch 的书“Effective Java”第 7 条第二版中,他建议避免使用 finally 语句,特别是在关闭文件时,他说“依赖终结器来关闭文件是一个严重错误”。两页后,他说合法的两个用例之一是显式终止方法模式

具有终止方法的类包括 FileInputStream 和 FileOutputStream。那么这是否意味着在 finally 语句中关闭文件?

1) Joshua Bloch 的第 7 项是否矛盾?

2)是否需要终止方法模式?如果没有具有相同效果的 finally 语句,您就不能编写上面的代码吗?

0 投票
2 回答
2690 浏览

java - 构建器模式:首选哪个变体?

我正在阅读 Effective Java 书,并为我的未来参考创建笔记,我遇到了 Builder Pattern。

好吧,我了解它是什么以及它应该如何使用。在此过程中,我创建了构建器模式的两个示例变体。

我需要帮助来列出差异和各自的优势吗?好吧,我当然注意到,Example 1公开的方法更少,限制更少,更通用,允许更灵活地使用。

请指出我错过的其他事情?

示例 1

示例 2

0 投票
3 回答
1143 浏览

java - Effective java Item no 74(关于序列化):明智地实现Serializable

在有效的 Java 书籍的第 74 项中有一段(第 74 项最后的第 2 段),其中提到如下:

内部类(Item 22)不应该实现 Serializable。他们使用编译器生成的合成字段来存储对封闭实例的引用并存储封闭范围内的局部变量的值。这些字段如何对应于类定义是未指定的,匿名类和本地类的名​​称也是如此。 因此,内部类的默认序列化形式定义不明确。

我知道内部类使用编译器生成的合成字段来存储对封闭实例的引用,例如,如果封闭类是 MyEnclosure 并且内部类是 MyInner,那么封闭引用是 MyEnclosure.this。但我无法获得BOLD部分。请帮我理解意思。谢谢!!!

0 投票
2 回答
3915 浏览

java - 了解有效的 Java 深拷贝示例

在 Effective Java, 2nd Edition, Item 11 中可以找到以下深拷贝示例:

我不明白这是如何进行深层复制的:键和值是对象,因此没有原始类型。所以据我了解,使用

Entry参考原始的键和值创建一个新的Entry?

深拷贝基本上不是意味着:向下直到达到原始类型,然后将它们复制到克隆?

感谢您对此的任何提示!

0 投票
2 回答
312 浏览

java - 如何从双重检查习语创建单例以延迟初始化实例字段?

我们几乎都知道这是double check idiom for lazy initialization of instance field. 但是我在这里有一个愚蠢的疑问,有人将如何创建 FieldType 的单例对象。至于调用函数getField()(创建单例实例),您需要一个类的实例,但到目前为止您还没有该实例。我有点困惑,请告诉我。谢谢!!!

0 投票
3 回答
28440 浏览

java - Java 模型对象设计

所以我一直在阅读一些有效的 Java!书中最鼓舞人心的部分之一是不可变对象/构建器部分,布洛赫在其中写了“构建器”——类,而不仅仅是 POJO。

注意:我在这里谈论模型对象:例如ArticleCar

这就是我之前编写这些对象的方式:

现在你看到这个设计在很多方面都有缺陷,它需要可变性,你必须先用构造函数构造对象,然后设置名称。

当然,现在您可以将name字段设为 final 并将其用作构造函数中的参数,但是如果您有一个大对象包装例如许多 SQL - 表,那么您将有一个丑陋的构造函数,如下所示:

这在创建对象时变得不可读,而这只是六个字段!

因此,布洛赫提出以下建议(具有不变性)

现在这给了我们不变性!如果你有一些对象不是原始的或不可变的,只需将它们复制到Builder's 的 setter 中并再次将它们复制到Car's 的 getter 中。

但这很罗嗦,如果类足够小,我一直在使用构造函数参数。如果一个类需要一个可变字段,如果该类具有足够的属性(> 4 个),我只需使该字段可变。

另一个问题是,当使用 android 并且该类具有例如 aBitmap时,您必须返回实际的位图而不是复制它,因为这相当性能 - 昂贵。

我见过很多这样的问题,但我似乎无法在这个问题上找到一个好的答案:这些设计有什么标准吗?它们的设计如何?有什么好处/缺点?

提前致谢!

编辑:

问题是:

构造一个应该是不可变的对象模型的最佳方法是什么,并且 A)少量字段和 B)大量字段?如何处理上述Bitmap问题和类似问题?使某些字段可变?

抱歉含糊其辞。

0 投票
1 回答
266 浏览

java - 实用程序类如何用于对最终类的方法进行分组,而不是扩展类?

Joshua Bloch 在他的书(Effective Java - 2nd Ed第 4 项中提到:-

仅包含静态字段和静态方法(实用程序类)的类可用于对最终类上的方法进行分组,而不是扩展类。

谁能解释一下这句话?