问题标签 [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 投票
3 回答
8779 浏览

java - 正如 Joshua Bloch 在有效的 Java 中所建议的那样,缓存哈希码在 Java 中是如何工作的?

我有以下来自 Joshua Bloch 的有效 java 的代码(第 9 项,第 3 章,第 49 页)

如果一个类是不可变的并且计算哈希码的成本很高,您可能会考虑在对象中缓存哈希码,而不是在每次请求时重新计算它。如果您认为大多数此类对象将用作哈希键,那么您应该在创建实例时计算哈希码。否则,您可能会选择在第一次调用 hashCode 时延迟初始化它(Item 71)。尚不清楚我们的 PhoneNumber 类是否值得这种处理,只是为了向您展示它是如何完成的:

我的问题是缓存(记住 hashCode)如何在这里工作。第一次hashCode()调用方法,没有hashCode将其分配给结果。关于这种缓存如何工作的简要说明会很棒。谢谢

0 投票
2 回答
702 浏览

java - 在 Effective Java 书中正确声明 read resolve 方法是什么意思?

来自 Effective Java 的序列化章节:

如果正在反序列化的对象的类定义了带有正确声明的 readResolve 方法,则在反序列化后新创建的对象上调用此方法。

Effective Java 中提供的示例如下, Javadoc所说的正确格式似乎throws缺少该部分,即ANY-ACCESS-MODIFIER Object readResolve() throws ObjectStreamException;

这里的正确声明是什么意思?如果声明不正确,该类甚至会编译吗?我发现这句话有点令人困惑。

0 投票
3 回答
404 浏览

java - 实例变量验证

阅读有效的java,它提到我们需要验证方法参数作为一种好习惯,公共方法抛出异常,私有方法断言。但是,我们是否需要对实例变量采取任何措施。

EG:(不要将示例作为用例,主要问题是Do I need to validate instance var or Not ?。示例仅用于解释我的意思。)

现在假设root从未初始化并doSomething()直接调用,它会导致 NullPtrException。

Do we need to guard against it ? If yes then how ? If no then why not ?

0 投票
2 回答
493 浏览

java - 为什么 Joshua Bloch 在有效的 java 中的 pop 方法中减少堆栈的“大小”值?

这是来自 Joshua Bloch 的有效 Java 第 2 版第 2 章第 6 项第 24 页的代码。在他定义的 pop 方法中,他使用elements[--size]. 我想知道他为什么使用--size,而不是elements[size--]应该返回相同的正确?

0 投票
2 回答
216 浏览

java - 空检查还是不做空检查?

这是 Josh bloch 编写的代码(Linkedlist.java)

在这里,我没有看到 Collection c 的任何空 ptr 检查。相反有效的java非常强调参数验证,强调空指针检查。If an invalid parameter value is passed to a method and the method checks its parameters before execution, it will fail quickly and cleanly with an appropriate exception.

我需要知道我错过了什么?换句话说,他为什么不对 addAll 函数进行空值检查?

0 投票
2 回答
99 浏览

java - 更喜欢哪个界面以及在什么基础上?

有效的 java 鼓励使用接口而不是抽象/具体类。问题是是否存在接口层次结构,应该选择哪种接口类型以及为什么?

例如,一个ArrayList实现List哪个实现Collection哪个实现Iterable。那么我们什么时候通过 a listvs collectionvs iterable

显而易见的答案是每个子类都在不断添加更多功能。那么我们是否应该继续向上爬,直到匹配所需的功能?我的意思是,如果只需要在一个虚构的应用程序iterator()中,那么使用Iterableelse 使用List

0 投票
3 回答
3356 浏览

java - hashCode 中的位运算符 >>>

我有两个相关的问题:

  1. 位运算符 >>> 意味着我们将二进制数移动了许多位,同时在最高有效位中填充 0。但是,为什么下面的操作会产生相同的数字:5>>>32 产生 5 和 -5>>>32 产生 -5。因为如果上面的描述是正确的,那么这两个操作都会产生 0 作为最终结果。

  2. 继续上面,根据 Effective Java 书,我们应该在计算哈希码(如果字段很长)时使用 (int) (f ^ (f >>> 32)) (如果字段很长)。我们为什么要这样做,解释是什么

0 投票
3 回答
2616 浏览

java - 对具有许多参数的方法使用构建器模式?

当面对使用大量参数的构造函数时,我已经阅读了“Effective Java”中的建议使用构建器模式。

相同的模式是否适用于具有大量参数的方法?

0 投票
3 回答
282 浏览

java - Effective Java Item 6 - Stack pop 实现

我一直在阅读 Effective Java,我发现过时的对象引用项给我的一件事是他的实现pop()

为什么有必要创建一个新的引用elements?为什么不做

这将清除过时的对象引用,而不必为数组创建新的引用。

0 投票
1 回答
294 浏览

java - 有效的 Java 项目 9,CaseInsensitiveString 示例是否正确?

我正在阅读本书的第二版,第 36 页。我不明白对称性问题的解决方案:

如果我有CaseInsensitiveString cis= new CaseInsensitiveString("hello")并且String s="hello"this 以非对称方式表现,因为s.equals(cis) 是真的,但是cis.equals(s) 是假的......

我错过了什么?