问题标签 [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 - 转发类示例
阅读Effective Java,我从Item 16: Favor composition over inheritance
.
在下面InstrumentedSet
,这本书展示了我们可以跟踪元素被插入的次数(通过InstrumentedSet.addCount
变量)。
为此,我们可以简单地附加到这个类对象的addCount
,然后调用ForwardingSet.add()
,它调用实际Set
类的实际实现add()
。
我是否正确理解,要使用这种模式/方法,Forwarding*
类必须调用其所有父类的方法(在这种情况下Set
)?
java - 如果私有函数需要相同的输入,是否应该在公共函数中显式进行异常检查
有效的java清楚地表明了一个assert
用于验证私有函数的参数。如果方法是公共方法,则如果 null 是无效参数,则该方法应抛出 NPE。
例如:
在上面的代码中,我们不需要显式检查来确保str
为 null,或者不是 null.toCharArray 将抛出 NPE
但是,如果代码更改为以下内容怎么办:
在这样的代码中,它落在私有函数栏上以抛出 NPE。根据有效的java,私有代码只能通过断言进行验证。下面的代码会被认为比上面的代码更好吗?
java - 私有函数应该如何做参数验证或用户输入和内部数据结构?
以下代码将返回总和为 x 的整数对,例如:如果 arr {1, 2, 3, 4, 5] 且 x 为 7,则列表应包含 {3, 4} 和 {2, 5}。主要目标是了解如何在私有方法中执行参数验证。问题嵌套在评论中,请将建议限制为仅提出的问题。感谢您深入研究代码以检查我的问题。
java - 具有两个相同类型元素的异构容器
我正在阅读Effective Java - Item 29。它讨论了Heterogeneous container,在示例中:
此模式参数化键而不是值,因此您不限于单一类型,不像:
我的问题是:如果有两个相同类型的元素需要添加到 中Map
,即两个String
,这种模式仍然有用吗?
java - 一个函数应该在多大程度上信任另一个函数
考虑一个名为 Graph 的类中的以下两个函数。完整的源代码可以在这里找到: http ://www.keithschwarz.com/interesting/code/?dir=dijkstra 。
在这里,该方法是它添加到 mGraphaddEdge
中的盲目信任方法。相信课堂上的其他方法正在正确地完成他们的工作,这是一种常见的做法吗?或者是否建议一种方法对一切都持怀疑态度并进行如下检查:addNode
hashmap
再一次,我有兴趣知道 whatscommonly done
和 whats ideally recommended
。
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]。那里发生了什么事?
java - 编写工厂方法最有效的方法是什么?
在大多数情况下,当我们编写工厂方法时,它是一堆if
可以不断增长的条件。编写这种方法最有效的方法是什么(if
条件最少)?
java - JavaBean的缺点——构造时不一致
JavaBean 在其构造过程中可能处于不一致的状态。
我无法理解这一点,如果在方法中构造对象,那将如何不一致,如果必须发生异常,也可能在构造函数中发生。这与线程有什么关系?
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
?
如果您想自己检查一下,我会在这篇文章中留下一个准备运行的示例:
java - Java - 泛型 - 类“Class ”的显式转换和转换方法
为什么cast
在类上使用该方法Class<?>
会在编译时产生未经检查的警告?
如果您查看 cast 方法,您会发现以下代码:
如果我进行泛型转换,编译器会抱怨说有unchecked warning
.
其他背景信息
您可以在 Book Effective Java 2 版第 166 页(pdf 的)中找到我如何解决这个问题的示例。
作者写了这段代码
对比
我只是不明白为什么编译器会抱怨未经检查的警告。最后,两段代码都进行了显式强制转换(T) object
,不是吗?