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

java - 在扩展类上使用构建器构造函数?

我正在实现一个 Builder 构造函数,如 Joshua Bloch 的“Effective Java 2nd Edition”中所述。但是,当我尝试扩展类及其构建器时,我遇到了一些复杂情况。本质上,扩展子类中的扩展 Builder 有设置返回父构建器类型而不是子构建器类型的字段方法。

当然,我可以在属性构建链中回滚到 ChildBuilder(如我的 main 方法中所示),但它不是无缝的,这违背了 Builder 的目的,它也迫使我分离父 setter 和子 setter。

我尝试使用泛型,但它最终变得比演员更冗长。

有没有一种方法可以让构建器上的 set 方法始终返回实际实例化的构建器类型?

0 投票
2 回答
3291 浏览

java - EI_EXPOSE_REP2 设置方法

Findbugs 抱怨日期对象并建议创建防御性副本。我在构造函数和getter方法中使用了副本,但是真的有必要在setter方法中创建一个防御性副本吗?这是一个例子:

有没有办法获取原始对象并进行更改?

0 投票
4 回答
1393 浏览

java - 有效的java项目9:覆盖hashcode示例

我正在阅读 Effective Java Item 9 并决定自己运行示例代码。但它的工作方式略有不同,具体取决于我如何插入一个我不明白里面到底发生了什么的新对象。PhoneNumber 类看起来:

然后根据这本书,就像我尝试的那样,

这将打印“null”,并且在书中进行了解释,因为 HashMap 有一个优化,可以缓存与每个条目关联的哈希码,并且如果哈希码不匹配,则不会检查对象是否相等。对于我,这说得通。但是当我这样做时:

现在它返回“珍妮”。你能解释为什么它在第二种情况下没有失败吗?

0 投票
5 回答
254799 浏览

java - 什么是断言错误?在哪种情况下我应该从我自己的代码中抛出它?

在《Effective Java, 2nd edition》一书的Item 2中,有一段代码,作者想在其中禁止一个对象的空初始化。

抛出的异常类型在这里让我感到困惑。

我不明白AssertionError是因为没有更合适的错误还是因为它应该是这样而抛出的。

assert据我了解,当语句失败时,框架会引发此错误。另外,在javadoc中它只是写的

[An AssertionError is] 抛出以指示断言失败。

但我没有看到这里违反了任何断言(真假陈述)。当然,“你不应该实例化这个类的一个项目”的声明已经被违反了,但是如果这是背后的逻辑,那么我们都应该AssertionError到处抛出 s,这显然不是发生的事情。

FWIW,我刚刚扔了一个

这有什么问题吗?AssertionError在这种情况下,我应该在自己的代码中抛出一个?

对不起,如果这只是一个微妙的疑问,但我在我的代码中经常使用这种模式,我想确保我做的是正确的事情。

0 投票
3 回答
1370 浏览

java - 为什么在泛型方法的定义中有时会省略返回类型之前的尖括号

我正在阅读有关泛型的 Effective Java 第 5 章,特别是有关首选泛型方法的项目。我注意到有时在返回类型之前的方法声明中的类型参数(尖括号之间)有时会被省略。有很多这样的情况,但例如在第二版的第 135 页:

另一方面,我在声明中看到了类似的泛型方法

第一个是错字吗?如果不是,我什么时候可以省略声明中的括号?

谢谢

0 投票
3 回答
105 浏览

java - 为将来可能的可扩展性保持一个非最终的值类

我正在创建一个名为 Catalog 的非常简单的类。它将是一个不可变的类,并有一个 id 和 name 字段。

出于习惯,由于我不会为了可扩展性而明确记录这个东西,所以我将 final 修饰符放在类上。但是我想知道,由于这是一个如此简单的值类,如果将来有人决定他们可以使用它,那么将 final 修饰符关闭会不会很痛苦?

0 投票
1 回答
579 浏览

java - 有效的 Java:构建器模式

我正在阅读 Effective java item# 2- The Builder pattern

http://www.informit.com/articles/article.aspx?p=1216151&seqNum=2

这里说java bean不是创建多参数对象的有效方式。但是,如果我以这种方式拥有 javabean 怎么办:

请注意,我将所有成员变量设为 Final

现在可以这样创建一个实例:

如果我这样做有什么问题?有人可以帮我理解吗?谢谢,拉詹

0 投票
2 回答
1166 浏览

java - 有效的 Java 项目 7:避免终结器

在这本令人惊叹的书中,作者 Josh Bloch 提到:

“哦,还有一件事:使用终结器会严重影响性能。在我的机器上,创建和销毁一个简单对象的时间约为 5.6 ns。添加终结器会将时间增加到 2,400 ns。换句话说,使用终结器创建和销毁对象的速度大约慢了 430 倍。”

有没有办法可以在java中删除和对象?
我认为我们可以简单地让对象超出范围或将它们重置为空。
我打算在我的机器上进行实验,这似乎是一个有趣的想法,但我不知道如何删除和反对。

0 投票
2 回答
1130 浏览

java - 有效的 Java 项目 11:明智地覆盖克隆

对于具有数组字段的类,Josh 说如果克隆方法仅返回 super.clone(),则生成的类实例将在原始字段中具有正确的值,但其数组字段将引用与原始类实例相同的数组。修改原件将破坏不变量,反之亦然。

他使用了自定义 Stack 实现的示例,我使用的是一个简单的 Student 类

请注意:我没有在我的克隆方法覆盖中的数组字段上调用 ​​clone()。

然后我做了:

输出:

我想知道更改原始实例中的数组也会更改我的克隆中的数组,因为我在上面提到“数组字段将引用与原始实例相同的数组”

通过我的克隆实现,我也应该看到克隆 s2 的变化。正确的实现应该是:

我误解了这个吗?有人可以解释发生了什么吗?


谢谢
~莫希特

0 投票
2 回答
716 浏览

java - 编程术语“身份函数”与身份有什么关系?(面向Java)

我刚刚阅读了 Bloch 的 Effective Java,在泛型章节中有一节讨论了“身份函数”。

我已经读过“为什么禁止这个未经检查的警告是安全的?” 并且答案解释了未经检查的警告问题,但是当身份功能似乎与身份无关时,让我对“身份功能”的概念完全不满意。

Bloch 只是假设我知道它是什么,但在他用来说明它的实现中,它与一个或多个身份无关。

我在 wikipedia 上查看了它:Identity Function @ wikipedia,但它的纯理论描述也没有告诉我它与身份有什么关系。

我在谷歌上搜索,有些人将.equals()and.hashCode()方法称为身份函数,这有点道理,但当然它们的实现与 Bloch 的方法完全不同,它返回输入参数不变。这和身份有什么关系?

其他人将数据库函数称为身份函数,在每次调用时给出一个新的 ID,这也更有意义,但显然范围非常有限。