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

java - 什么是非内存资源?

我正在阅读“有效的 Java ”。

在关于 finalize 的讨论中,他说

C++ 析构函数也用于回收其他非内存资源。在 Java 中,try finally 块通常用于此目的。

什么是非内存资源?

数据库连接是非内存资源吗?保持数据库连接的对象不会占用一些内存吗?

0 投票
8 回答
3048 浏览

java - 原始类型、无界通配符和在泛型中使用 Object 有什么区别

我正在阅读有效 Java 中的泛型一章。

帮助我理解和之间Set的区别?Set<?>Set<Object>

以下段落摘自书中。

快速回顾一下,Set<Object>它是一种参数化类型,表示可以包含任何类型的对象的集合,Set<?>是一种通配符类型,表示只能包含某种未知类型的对象的集合,并且Set是一种原始类型,它选择退出泛型类型系统。

“某种未知类型”是什么意思?都是未知类型的类型Object吗?Set<?>在那种情况下和之间的具体区别是Set<Object>什么?

0 投票
3 回答
8078 浏览

java - 泛型中的“递归类型绑定”是什么意思?

我正在阅读 Effective Java [Item 27] 中的泛型一章。

书中有这样一段话:

尽管相对很少见,但允许类型参数受一些涉及该类型参数本身的表达式的限制。这就是所谓的递归类型绑定。

还有这个:

什么是递归类型绑定,上面的代码如何帮助实现相互可比性?

0 投票
2 回答
963 浏览

java - 嵌套的静态构建器类,对其管道的进一步解释

然后这样调用:

这一切都很可爱,但我不明白几个部分。

有两个New语句,一个在调用语句中,一个在build()方法中,但是只创建了一个新对象?

另外,如果我再调用第二次,没有第二个可选参数:

MyPojo myPojo = new MyPojo.Builder("req").optionalOne(1).build();

为什么 optionalTwo 会恢复为默认值(零)。并且不保留第一次传递的值(2),它是一个静态类,所以一个实例在所有 MyPojos 之间共享?

0 投票
4 回答
6531 浏览

java - Java:序列化期间何时添加 readObjectNoData()?

我正在阅读Effective Java中的序列化章节。我正在尝试理解以下段落,该段落可在书中找到。

如果您使用可序列化和可扩展的实例字段实现类,则应注意一个注意事项。如果类的实例字段被初始化为其默认值(整数类型为零,布尔类型为 false,对象引用类型为 null),则该类具有将被违反的不变量,则必须将此 readObjectNoData 方法添加到该类中:

我不确定那句话是什么意思。

为了测试这一点,我创建了一个名为Person的类(可序列化和可扩展)

– 和一个类:Employee,它扩展了它。

我创建的 Person 类中是否有任何不变量?他们什么时候会被侵犯?我在Employee类中复制粘贴了该readObjectData()方法的代码,但它从未被调用。什么时候调用该方法?我错过了什么吗?readObject()

0 投票
6 回答
23705 浏览

java - 为什么 readObject 和 writeObject 是私有的,为什么我要显式地编写瞬态变量?

我正在阅读Effective Java中的序列化一章。

  1. 谁调用 readObject() 和 writeObject()?为什么将这些方法声明为私有?

  2. 下面是书中的一段代码

    是否有任何特定原因将该变量size声明为瞬态,然后在 writeObject 方法中显式写入它?如果它没有被声明为瞬态,它无论如何都会被写入,对吧?

0 投票
2 回答
950 浏览

java - Effective Java 中的第 9 项(等于合同):示例正确吗?

Bloch 的精彩著作《Effective Java》指出,如果equals不是对称的,那么集合的行为contains是不确定的。

在他给出的示例中(在下面稍作修改后复制),布洛赫说他看到了“假”,但也可以看到真或异常。

如果标准未指定是否contains(Object o)检查e.equals(o)o.equals(e)针对集合中的每个项目,您可能会看到“true”,并且前者已实施。但是,Collections Javadoc明确指出它必须是后者(这就是我观察到的)。

因此,我看到的唯一可能性是“错误”或可能是异常(但String Javadoc似乎排除了后者)。

我理解更广泛的观点,不对称很可能equals会导致集合之外的代码出现问题,但我没有看到他引用的示例。

我错过了什么吗?

0 投票
1 回答
560 浏览

java - JavaBean 的 getter/setter 实现中可为空的 java.util.Date 的“防御性复制”的优雅实现示例?

使用下面的示例,是否有 Joshua Bloch 的防御性复制技术的优雅 Java 实现?nullChecking 确实是我认为的问题,但也许有一种更简单的方法来实现防御性复制。

0 投票
3 回答
2276 浏览

java - 在 equals 和 hashcode 方法中使用自动生成的 Hibernate 实体对象的 id

可爱的等号和哈希码,所有的理论都在这里这里

我已决定在我的许多休眠实体/域对象中使用 equals() 和 hashcode() 中的自动生成的 ID。

但是,许多网站表示您永远不应该这样做,因为在比较或使用哈希码的过程中第一次将对象持久化到数据库中的风险。

我的观点是,在大多数用例中,这比更改任何其他字段的可能性要小得多。

单个域对象在首次创建时生成一次 id,而几乎所有其他字段都有机会在正常业务流程中进行更改(甚至可以更改唯一的用户名......)。

在我的许多域对象中,唯一 id 几乎是唯一需要考虑的字段(人、地址、宠物、... 客户等)?组合字段是个好主意,但从使用自动生成的 id,我想,不是什么好建议。

我错过了其他东西吗?

0 投票
7 回答
973 浏览

java - java中的不可变

Effective Java中,Bloch 建议在使对象不可变时使所有字段最终化。

有必要这样做吗?不会只是不提供访问器方法使其不可变。

例如

即使我没有声明xfinal正确,上面的类也是不可变的?我错过了什么吗?