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

java - 转发类示例

阅读Effective Java,我从Item 16: Favor composition over inheritance.

在下面InstrumentedSet,这本书展示了我们可以跟踪元素被插入的次数(通过InstrumentedSet.addCount变量)。

为此,我们可以简单地附加到这个类对象的addCount,然后调用ForwardingSet.add(),它调用实际Set类的实际实现add()

我是否正确理解,要使用这种模式/方法,Forwarding*类必须调用其所有父类的方法(在这种情况下Set)?

0 投票
1 回答
100 浏览

java - 如果私有函数需要相同的输入,是否应该在公共函数中显式进行异常检查

有效的java清楚地表明了一个assert用于验证私有函数的参数。如果方法是公共方法,则如果 null 是无效参数,则该方法应抛出 NPE。

例如:

在上面的代码中,我们不需要显式检查来确保str为 null,或者不是 null.toCharArray 将抛出 NPE

但是,如果代码更改为以下内容怎么办:

在这样的代码中,它落在私有函数栏上以抛出 NPE。根据有效的java,私有代码只能通过断言进行验证。下面的代码会被认为比上面的代码更好吗?

0 投票
3 回答
266 浏览

java - 私有函数应该如何做参数验证或用户输入和内部数据结构?

以下代码将返回总和为 x 的整数对,例如:如果 arr {1, 2, 3, 4, 5] 且 x 为 7,则列表应包含 {3, 4} 和 {2, 5}。主要目标是了解如何在私有方法中执行参数验证。问题嵌套在评论中,请将建议限制为仅提出的问题。感谢您深入研究代码以检查我的问题。

0 投票
2 回答
596 浏览

java - 具有两个相同类型元素的异构容器

我正在阅读Effective Java - Item 29。它讨论了Heterogeneous container,在示例中:

此模式参数化键而不是值,因此您不限于单一类型,不像:

我的问题是:如果有两个相同类型的元素需要添加到 中Map,即两个String,这种模式仍然有用吗?

0 投票
8 回答
117 浏览

java - 一个函数应该在多大程度上信任另一个函数

考虑一个名为 Graph 的类中的以下两个函数。完整的源代码可以在这里找到: http ://www.keithschwarz.com/interesting/code/?dir=dijkstra 。

在这里,该方法是它添加到 mGraphaddEdge中的盲目信任方法。相信课堂上的其他方法正在正确地完成他们的工作,这是一种常见的做法吗?或者是否建议一种方法对一切都持怀疑态度并进行如下检查:addNodehashmap

再一次,我有兴趣知道 whatscommonly done和 whats ideally recommended

0 投票
2 回答
533 浏览

java - 谁能解释一下 Joshua Bloch 第 41 条的例子?

我现在正在阅读 Joshua Bloch 的“Effective Java”,当我阅读第 41 条“明智地使用重载”时,我因为那里使用的示例而感到困惑。我在电脑上试了一下,它确实做到了书中的作用。但我不明白为什么!

这是这个例子:

它输出:

[-3, -2, -1] [-2, 0, 2]

我知道这个例子中的 list.remove() 应该按索引删除,但事实并非如此!列表填满值后,它是:[-3, -2, -1, 0, 1, 2]。因此,当我们删除 0、1 和 2 个元素时,我们应该保留 [0, 1, 2] 而不是 [-2, 0, 2]。那里发生了什么事?

0 投票
3 回答
2422 浏览

java - 编写工厂方法最有效的方法是什么?

在大多数情况下,当我们编写工厂方法时,它是一堆if可以不断增长的条件。编写这种方法最有效的方法是什么(if条件最少)?

0 投票
2 回答
727 浏览

java - JavaBean的缺点——构造时不一致

有效的 Java - Item-2 状态

JavaBean 在其构造过程中可能处于不一致的状态。

我无法理解这一点,如果在方法中构造对象,那将如何不一致,如果必须发生异常,也可能在构造函数中发生。这与线程有什么关系?

0 投票
4 回答
1011 浏览

java - Effective Java - Item 25 - Generics class cast exception Mixing List and Arrays

我正在阅读 Joshua Bloch 的 Effective Java 2nd edition,第 25 项(第 122 页)。当您进一步阅读本章时,您会到达作者编写以下代码的地步:

然后作者声明编译器不会编译它,因为您需要在分配的行中添加显式强制转换E[] snapshot = list.toArray();,从而导致此E[] snapshot = (E[]) list.toArray();,然后您会收到一条警告说有[unchecked] unchecked cast


Q1:我知道这本书考虑到了 Java 6 的变化(我们现在几乎是 Java 8)。但是,我编写了相同的方法,从编译中得到相同的错误。这是因为我需要添加显式演员表。但是没有警告。那么这个警告是关于什么的呢?


Q2:作者声明以下方法可行,但事实证明它不是类型安全的。

稍加修改,您就可以让它 ClassCastException在不包含显式转换的行上抛出 a 。

好的,我明白了......但是我怎样才能让它抛出一个ClassCastException


如果您想自己检查一下,我会在这篇文章中留下一个准备运行的示例:

0 投票
2 回答
1328 浏览

java - Java - 泛型 - 类“Class ”的显式转换和转换方法

为什么cast在类上使用该方法Class<?>会在编译时产生未经检查的警告?

如果您查看 cast 方法,您会发现以下代码:

如果我进行泛型转换,编译器会抱怨说有unchecked warning.


其他背景信息

您可以在 Book Effective Java 2 版第 166 页(pdf 的)中找到我如何解决这个问题的示例。

作者写了这段代码

对比

我只是不明白为什么编译器会抱怨未经检查的警告。最后,两段代码都进行了显式强制转换(T) object,不是吗?