问题标签 [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 回答
303 浏览

java - 为什么不可变 new String("fish") != new String("fish")?

我记得读过一段,可能在 Bloch 的Effective Java中,说在大多数情况下,

在大多数情况下 a == b 因为字符串是不可变的。但是由于对象的临时构造或类似的构造, new String("fish") 会产生一个不同的对象引用。

我浏览了有关 equals()、不变性和对象创建的 Bloch 章节,但找不到我记得的这一点!扯掉我的头发,有人记得这是为什么的描述吗?它甚至可能不在EJ中,但我想找到它。提示:这在哪里解释是我的实际问题。

0 投票
3 回答
446 浏览

java - java:作为策略的函数对象

我正在阅读有效的 Java。在讨论使用函数对象作为策略的部分中,存在以下段落。

因为策略接口用作其所有具体策略实例的类型,所以不需要公开具体策略类来导出具体策略。相反,“宿主类”可以导出类型为策略接口的公共静态字段(或静态工厂方法),具体策略类可以是宿主的私有嵌套类

我的问题是,使用上述方式有什么特别的优势吗?通过公开具体战略来输出战略有什么问题?

0 投票
4 回答
231 浏览

java - 在java中实现hashcode()

在编写一个用 Effective java 编写的好 hashCode() 的指南中,如果字段很长,作者提到了以下步骤。

如果字段是长的,则计算 (int) (f ^ (f >>> 32))。

我不明白为什么这样做。我们为什么这样做呢 ?

0 投票
2 回答
361 浏览

android - 为什么许多 Android API 类不是最终的,即使它们没有明确记录继承?

Effective Java (Joshua Bloch) Item 17 说:

“设计和记录或继承或禁止它”

但是,只要粗略浏览一下 Android API,就会发现大多数 API 类都不是最终的。如果它们也被记录为继承(例如),那是可以View的。Activity但是也有几个非最终类,但是文档没有提到这些类的可继承性。只是一些随意的例子来说明我的观点:

  • 代表系统服务的类 ( WifiManager, NotificationManager...)
  • 实用程序类,如UriMatcher.
  • 一些特定于硬件的类,例如Camera.

开放性和可扩展性是 Android 的哲学,这里的约定是否颠倒了?意思是,可以假设所有Android API 类都被设计为可继承的(无论是否明确记录);除非宣布最终?

0 投票
4 回答
244 浏览

java - Java:关于克隆方法的问题

我正在阅读有效的 Java,这本书对克隆方法有以下评论。

在实践中,实现 Cloneable 的类有望提供正常运行的公共克隆方法。通常,除非该类的所有超类都提供行为良好的克隆实现(无论是公共的还是受保护的),否则不可能这样做。

谁能举例说明为什么不能这样做?

0 投票
3 回答
2194 浏览

java - 多个线程读取一个变量

我正在阅读 Joshua Bloch 的“Effective Java Second Edition”,我对以下关于并发的声明感到困惑 -

“语言规范保证读取或写入变量是原子的,除非变量的类型为 long 或 double [JLS, 14.4.7]。换句话说,读取除 long 或 double 之外的变量保证返回一个值被某个线程存储到该变量中,即使多个线程同时修改变量并且没有同步。”

如果有人手头有书,这在第 259 页的最后一段中有说明。

即使多个线程正在修改它,引用的变量是否总是有值?

0 投票
4 回答
1340 浏览

java - 我们是否需要更喜欢构造函数而不是静态工厂方法?如果有,什么时候?

我一直在阅读Joshua Bloch的《 Effective Java》,到目前为止,它确实名副其实。第一项为静态工厂方法优于构造函数提供了一个令人信服的案例。以至于我开始质疑好的旧构造函数的有效性:)。

本书的优缺点总结如下:

好处:

  1. 他们有名字!
  2. 我们拥有完全的实例控制(单例、性能等)
  3. 他们可以返回一个子类型/接口
  4. 编译器可以提供类型推断

缺点:

  1. 私有类不能被子类化
  2. 它们不像构造函数那样在文档中脱颖而出

第一个缺点实际上可能是一件好事(如书中所述)。第二个,我认为只是一个小缺点,可以通过即将发布的 java 版本轻松解决(javadoc 的注释等)

看起来,最终工厂方法几乎具有构造函数的所有优点,还有更多优点,而没有真正的缺点!

所以,我的问题基本上分为三个部分:

  1. 默认情况下始终使用静态工厂方法而不是构造函数是一种好习惯吗?
  2. 使用构造函数是否合理?
  3. 为什么面向对象的语言不为工厂提供语言级别的支持?

注意:有两个类似的问题:什么时候使用 Constructor 和什么时候使用 getInstance() 方法(静态工厂方法)?对象的创建:构造函数或静态工厂方法。然而,答案要么只是提供上面的列表,要么重申我已经知道的静态工厂方法背后的基本原理。

0 投票
2 回答
468 浏览

java - 为什么在进行双重检查锁定时将易失性字段复制到局部变量

我正在阅读有关从Effective Java. 该代码执行以下操作:

它说 usingresult似乎不需要,但实际上确保field在它已经初始化的常见情况下只读取一次。

但我不明白这一点。和直接做有什么区别if(field == null)?我不明白为什么if (result == null)会有所不同,更不用说如上所述了。

0 投票
1 回答
367 浏览

java - 未经检查的异常,本来会更好的检查

我意识到已经 Java 中已检查异常与未检查异常的相对优点进行了充分的 讨论,我无意重新讨论整个辩论。

相反,我想问一个我在阅读 Joshua Bloch 的 Effective Java, 2nd Edition 时想到的一个非常具体的问题。在阅读的过程中,我注意到在 Item 59(“避免不必要地使用受检异常”)中,Joshua 在 Java API 中给出了一个使用受检异常的示例。具体来说,在Object

...然后争辩说它应该是一个未经检查的异常。

如果使用 API 的程序员不能做得更好,那么未经检查的异常会更合适。未能通过此测试的异常示例之一是 CloneNotSupportedException。它由 Object.clone 抛出,它应该只在实现 Cloneable 的对象上调用(第 11 项)。在实践中,catch 块几乎总是具有断言失败的特征。异常的检查性质对程序员没有好处,但它需要努力并使程序复杂化。

然后我看看他是否有相反的例子,但我找不到。

所以我想问一下是否有人可以给出一个使用未检查异常的Java示例API,但是检查异常会是一个更好的选择,并解释原因。一个现实世界的例子会更好,但如果这也能说明问题,我愿意接受一个人为的例子。

编辑: 对于那些投票以非建设性的方式结束这一点的人,我想明确表示我不是在寻找意见、辩论、争论或扩展讨论。我也没有进行民意调查。相反,我正在寻找可以对收益如何超过成本进行清晰分析的示例参考。(其中隐含的是承认有成本。)也就是说,我怀疑这个问题的性质是否使这成为可能。我认为如果 Jon Skeet 做不到,那也不太可能做到。所以也许你是对的。如果必须关闭。

编辑:虽然我对回应不为所动,但我将把这个奖励给乔恩只是为了我的接受率。

0 投票
2 回答
2378 浏览

java - 需要解释 Effective Java 教科书中的哈希码示例

这是第 9 项中的示例代码:

第 48 页指出:“选择值 31 是因为它是一个奇数素数。如果它是偶数并且乘法溢出,信息将会丢失,因为乘以 2 相当于移位。”

我理解乘以 2 的概念相当于位移。我也知道当我们将一个大数乘以一个大奇数素数时,我们仍然会出现溢出(因此信息丢失)。我不明白为什么由大奇数乘法引起的信息丢失比由大偶数乘法引起的信息丢失更可取。