问题标签 [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.
java - 正如 Joshua Bloch 在有效的 Java 中所建议的那样,缓存哈希码在 Java 中是如何工作的?
我有以下来自 Joshua Bloch 的有效 java 的代码(第 9 项,第 3 章,第 49 页)
如果一个类是不可变的并且计算哈希码的成本很高,您可能会考虑在对象中缓存哈希码,而不是在每次请求时重新计算它。如果您认为大多数此类对象将用作哈希键,那么您应该在创建实例时计算哈希码。否则,您可能会选择在第一次调用 hashCode 时延迟初始化它(Item 71)。尚不清楚我们的 PhoneNumber 类是否值得这种处理,只是为了向您展示它是如何完成的:
我的问题是缓存(记住 hashCode)如何在这里工作。第一次hashCode()
调用方法,没有hashCode
将其分配给结果。关于这种缓存如何工作的简要说明会很棒。谢谢
java - 在 Effective Java 书中正确声明 read resolve 方法是什么意思?
来自 Effective Java 的序列化章节:
如果正在反序列化的对象的类定义了带有正确声明的 readResolve 方法,则在反序列化后新创建的对象上调用此方法。
Effective Java 中提供的示例如下, Javadoc所说的正确格式似乎throws
缺少该部分,即ANY-ACCESS-MODIFIER Object readResolve() throws ObjectStreamException;
这里的正确声明是什么意思?如果声明不正确,该类甚至会编译吗?我发现这句话有点令人困惑。
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 ?
java - 为什么 Joshua Bloch 在有效的 java 中的 pop 方法中减少堆栈的“大小”值?
这是来自 Joshua Bloch 的有效 Java 第 2 版第 2 章第 6 项第 24 页的代码。在他定义的 pop 方法中,他使用elements[--size]
. 我想知道他为什么使用--size
,而不是elements[size--]
应该返回相同的正确?
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 函数进行空值检查?
java - 更喜欢哪个界面以及在什么基础上?
有效的 java 鼓励使用接口而不是抽象/具体类。问题是是否存在接口层次结构,应该选择哪种接口类型以及为什么?
例如,一个ArrayList
实现List
哪个实现Collection
哪个实现Iterable
。那么我们什么时候通过 a list
vs collection
vs iterable
?
显而易见的答案是每个子类都在不断添加更多功能。那么我们是否应该继续向上爬,直到匹配所需的功能?我的意思是,如果只需要在一个虚构的应用程序iterator()
中,那么使用Iterable
else 使用List
?
java - hashCode 中的位运算符 >>>
我有两个相关的问题:
位运算符 >>> 意味着我们将二进制数移动了许多位,同时在最高有效位中填充 0。但是,为什么下面的操作会产生相同的数字:5>>>32 产生 5 和 -5>>>32 产生 -5。因为如果上面的描述是正确的,那么这两个操作都会产生 0 作为最终结果。
继续上面,根据 Effective Java 书,我们应该在计算哈希码(如果字段很长)时使用 (int) (f ^ (f >>> 32)) (如果字段很长)。我们为什么要这样做,解释是什么
java - 对具有许多参数的方法使用构建器模式?
当面对使用大量参数的构造函数时,我已经阅读了“Effective Java”中的建议使用构建器模式。
相同的模式是否适用于具有大量参数的方法?
java - Effective Java Item 6 - Stack pop 实现
我一直在阅读 Effective Java,我发现过时的对象引用项给我的一件事是他的实现pop()
:
为什么有必要创建一个新的引用elements
?为什么不做
这将清除过时的对象引用,而不必为数组创建新的引用。
java - 有效的 Java 项目 9,CaseInsensitiveString 示例是否正确?
我正在阅读本书的第二版,第 36 页。我不明白对称性问题的解决方案:
如果我有CaseInsensitiveString cis= new CaseInsensitiveString("hello")
并且String s="hello"
this 以非对称方式表现,因为s.equals(cis)
是真的,但是cis.equals(s)
是假的......
我错过了什么?