问题标签 [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 - 在扩展类上使用构建器构造函数?
我正在实现一个 Builder 构造函数,如 Joshua Bloch 的“Effective Java 2nd Edition”中所述。但是,当我尝试扩展类及其构建器时,我遇到了一些复杂情况。本质上,扩展子类中的扩展 Builder 有设置返回父构建器类型而不是子构建器类型的字段方法。
当然,我可以在属性构建链中回滚到 ChildBuilder(如我的 main 方法中所示),但它不是无缝的,这违背了 Builder 的目的,它也迫使我分离父 setter 和子 setter。
我尝试使用泛型,但它最终变得比演员更冗长。
有没有一种方法可以让构建器上的 set 方法始终返回实际实例化的构建器类型?
java - EI_EXPOSE_REP2 设置方法
Findbugs 抱怨日期对象并建议创建防御性副本。我在构造函数和getter方法中使用了副本,但是真的有必要在setter方法中创建一个防御性副本吗?这是一个例子:
有没有办法获取原始对象并进行更改?
java - 有效的java项目9:覆盖hashcode示例
我正在阅读 Effective Java Item 9 并决定自己运行示例代码。但它的工作方式略有不同,具体取决于我如何插入一个我不明白里面到底发生了什么的新对象。PhoneNumber 类看起来:
然后根据这本书,就像我尝试的那样,
这将打印“null”,并且在书中进行了解释,因为 HashMap 有一个优化,可以缓存与每个条目关联的哈希码,并且如果哈希码不匹配,则不会检查对象是否相等。对于我,这说得通。但是当我这样做时:
现在它返回“珍妮”。你能解释为什么它在第二种情况下没有失败吗?
java - 什么是断言错误?在哪种情况下我应该从我自己的代码中抛出它?
在《Effective Java, 2nd edition》一书的Item 2中,有一段代码,作者想在其中禁止一个对象的空初始化。
抛出的异常类型在这里让我感到困惑。
我不明白AssertionError
是因为没有更合适的错误还是因为它应该是这样而抛出的。
assert
据我了解,当语句失败时,框架会引发此错误。另外,在javadoc中它只是写的
[An AssertionError is] 抛出以指示断言失败。
但我没有看到这里违反了任何断言(真假陈述)。当然,“你不应该实例化这个类的一个项目”的声明已经被违反了,但是如果这是背后的逻辑,那么我们都应该AssertionError
到处抛出 s,这显然不是发生的事情。
FWIW,我刚刚扔了一个
这有什么问题吗?AssertionError
在这种情况下,我应该在自己的代码中抛出一个?
对不起,如果这只是一个微妙的疑问,但我在我的代码中经常使用这种模式,我想确保我做的是正确的事情。
java - 为什么在泛型方法的定义中有时会省略返回类型之前的尖括号
我正在阅读有关泛型的 Effective Java 第 5 章,特别是有关首选泛型方法的项目。我注意到有时在返回类型之前的方法声明中的类型参数(尖括号之间)有时会被省略。有很多这样的情况,但例如在第二版的第 135 页:
另一方面,我在声明中看到了类似的泛型方法
第一个是错字吗?如果不是,我什么时候可以省略声明中的括号?
谢谢
java - 为将来可能的可扩展性保持一个非最终的值类
我正在创建一个名为 Catalog 的非常简单的类。它将是一个不可变的类,并有一个 id 和 name 字段。
出于习惯,由于我不会为了可扩展性而明确记录这个东西,所以我将 final 修饰符放在类上。但是我想知道,由于这是一个如此简单的值类,如果将来有人决定他们可以使用它,那么将 final 修饰符关闭会不会很痛苦?
java - 有效的 Java:构建器模式
我正在阅读 Effective java item# 2- The Builder pattern
http://www.informit.com/articles/article.aspx?p=1216151&seqNum=2
这里说java bean不是创建多参数对象的有效方式。但是,如果我以这种方式拥有 javabean 怎么办:
请注意,我将所有成员变量设为 Final
现在可以这样创建一个实例:
如果我这样做有什么问题?有人可以帮我理解吗?谢谢,拉詹
java - 有效的 Java 项目 7:避免终结器
在这本令人惊叹的书中,作者 Josh Bloch 提到:
“哦,还有一件事:使用终结器会严重影响性能。在我的机器上,创建和销毁一个简单对象的时间约为 5.6 ns。添加终结器会将时间增加到 2,400 ns。换句话说,使用终结器创建和销毁对象的速度大约慢了 430 倍。”
有没有办法可以在java中删除和对象?
我认为我们可以简单地让对象超出范围或将它们重置为空。
我打算在我的机器上进行实验,这似乎是一个有趣的想法,但我不知道如何删除和反对。
java - 有效的 Java 项目 11:明智地覆盖克隆
对于具有数组字段的类,Josh 说如果克隆方法仅返回 super.clone(),则生成的类实例将在原始字段中具有正确的值,但其数组字段将引用与原始类实例相同的数组。修改原件将破坏不变量,反之亦然。
他使用了自定义 Stack 实现的示例,我使用的是一个简单的 Student 类
请注意:我没有在我的克隆方法覆盖中的数组字段上调用 clone()。
然后我做了:
输出:
我想知道更改原始实例中的数组也会更改我的克隆中的数组,因为我在上面提到“数组字段将引用与原始实例相同的数组”
通过我的克隆实现,我也应该看到克隆 s2 的变化。正确的实现应该是:
我误解了这个吗?有人可以解释发生了什么吗?
谢谢
~莫希特
java - 编程术语“身份函数”与身份有什么关系?(面向Java)
我刚刚阅读了 Bloch 的 Effective Java,在泛型章节中有一节讨论了“身份函数”。
我已经读过“为什么禁止这个未经检查的警告是安全的?” 并且答案解释了未经检查的警告问题,但是当身份功能似乎与身份无关时,让我对“身份功能”的概念完全不满意。
Bloch 只是假设我知道它是什么,但在他用来说明它的实现中,它与一个或多个身份无关。
我在 wikipedia 上查看了它:Identity Function @ wikipedia,但它的纯理论描述也没有告诉我它与身份有什么关系。
我在谷歌上搜索,有些人将.equals()
and.hashCode()
方法称为身份函数,这有点道理,但当然它们的实现与 Bloch 的方法完全不同,它返回输入参数不变。这和身份有什么关系?
其他人将数据库函数称为身份函数,在每次调用时给出一个新的 ID,这也更有意义,但显然范围非常有限。