问题标签 [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 回答
6702 浏览

java - 使用工厂方法理解像 JDBC 这样的服务提供者框架背后的概念

来自Effective Java第 1 项考虑静态工厂方法而不是构造函数):

在编写包含该方法的类时,静态工厂方法返回的对象的类甚至不需要存在。这种灵活的静态工厂方法构成了服务提供者框架的基础,例如 Java 数据库连接 API (JDBC)。服务提供者框架是一个系统,其中多个服务提供者实现一个服务,并且系统将实现提供给它的客户端,将它们与实现解耦。

我特别不明白为什么这本书说静态工厂方法返回的对象的类在编写包含该方法的类时甚至不需要存在?有人可以以 JDBC 为例进行解释。

0 投票
2 回答
439 浏览

java - 有效java中的静态工厂方法

在 Effective Java 的第 1 项中,它说静态工厂方法使 Collections 框架比原本要小得多。有人可以解释一下吗?我无法理解仅因为使用静态工厂方法而可能发生以下情况?我的意思是我们仍然必须实现那些单独的实现,不是吗?

Collections Framework API 比导出 32 个独立的公共类(每个便利实现一个)时要小得多。

0 投票
3 回答
2679 浏览

java - 为方法调用调整 Builder 模式

这是试图理解第 40 项的一部分:从 Effective Java 2nd Edition仔细设计方法签名。

提高方法签名可读性的建议之一是针对四个或更少的参数。建议使用多种技术管理较长的参数列表,其中一种技术如下:

第三种结合前两种技术的技术是将 Builder 模式(第 2 项)从对象构造调整到方法调用。如果您有一个带有许多参数的方法,特别是如果其中一些参数是可选的,那么定义一个表示所有参数的对象并允许客户端对该对象进行多次“setter”调用会很有好处,每个它设置一个参数或一个小的相关组。一旦设置了所需的参数,客户端就会调用对象的“执行”方法,该方法对参数进行任何最终有效性检查并执行实际计算。

我熟悉 Builder 模式,因为它用于对象构造,但不确定我是否正确理解如何使其适应方法调用。

到目前为止,这是我所拥有的:(
我试图改进该方法的方法调用move

我对 Joshua Bloch 建议的解释是否正确?

0 投票
2 回答
643 浏览

java - 使用单检查习语进行延迟初始化

在“Effective Java, Second Edition”的第 71 项中,引入了双重检查习惯用法和单一检查习惯用法,用于延迟实例化实例字段。

双重检查成语

单检查成语

在复查习语 Joshua 中,结果变量用于确保 volatile字段只被读取一次,从而提高了性能。这我理解,但是我不明白为什么我们需要在单检查习语中使用它,因为无论如何我们只读取一次字段。

0 投票
1 回答
2306 浏览

java - 有效的Java。可序列化生成器模式(如何添加公共无参数构造函数?)

我想使用 Builder 模式以 Joshua Bloch 的风格创建一个类。但我想使用这个类作为 DTO 对象并从 EJB 传输它。所以它需要有公共的无参数构造函数。如何在构建器模式中实现这种 java-bean 样式?在 Effective Java 对象中,只有一个接受Builder对象作为参数的构造函数。如果我在那里添加公共无参数构造函数,那么我就失去了构建器优于 Java-bean 模式的优势。

0 投票
3 回答
4677 浏览

java - 如何使用单个构建器构建多个对象?

这个直接来自 Effective java 2。我不确定第 2 项中的这个陈述是什么意思

Builder 模式很灵活。单个构建器可用于构建多个对象。构建器的参数可以在对象创建之间进行调整以改变对象。

我无法想出一个例子来做到这一点。请通过一个例子帮助我理解这一点。

0 投票
5 回答
17142 浏览

java - Java中任何对象的编译时类型与运行时类型有什么区别?

Java中任何对象的编译时和运行时类型有什么区别?我正在阅读Effective Java书,Joshua Bloch 在 Item 26 中多次提到数组实例的编译时类型和运行时类型,主要是为了描述有时抑制强制转换警告是安全的。

在这里,作者正在谈论这些不同类型types的数组上下文。但是通过这个问题,我想了解compile time typesvsrun time types对于任何类型的 object 之间的区别。

0 投票
4 回答
464 浏览

java - 说一个列表在内部被锁定是什么意思?

这段代码来自《Effective Java》一书

我主要对这里的评论感兴趣。它是否在列表中unmodifiable?说一个列表在内部被锁定是什么意思?这把锁能保存多久?将 List 转换为数组是否有更好的选择?

0 投票
3 回答
3688 浏览

java - 什么是标量类型,为什么将未经检查的强制转换抑制为数组类型比标量类型风险更大?

来自 Effective Java Item 26 Favor Generic types

在所有其他条件相同的情况下,将未经检查的强制转换抑制为数组类型比标量类型风险更大,这将建议第二种解决方案。但是在比 Stack 更现实的泛型类中,您可能会在代码中的许多点从数组中读取,因此选择第二种解决方案需要多次转换为 E 而不是一次转换为 E[],这就是为什么第一种解决方案更常用 [Naftalin07, 6.7]。

作者scalar type在这里是什么意思,他想在这里表达什么?什么选项 1 被认为比选项 2 更危险?

编码 :

VS

0 投票
3 回答
297 浏览

java - 为什么抑制这个未经检查的警告是安全的?

考虑在Effective Java generics 一章UnaryFunction中定义的接口。

以及以下用于返回的代码UnaryFunction

为什么演员表IDENTITY_FUNCTION(UnaryFunction<T>)安全的?

这本书对我提出的问题进行了说明,但我无法遵循这里的逻辑。我们在哪里调用apply执行身份操作的函数?我很困惑,因为它是返回传递给它的相同对象而不修改任何东西的函数。

IDENTITY_FUNCTION 的强制转换(UnaryFunction<T>)生成一个未经检查的强制转换警告,因为UnaryFunction<Object>它不是一个 UnaryFunction<T>for each T。但是标识函数很特殊:它返回未修改的参数,因此我们知道将其用作类型安全UnaryFunction<T>的值是T. 因此,我们可以放心地抑制此强制转换生成的未经检查的强制转换警告。完成此操作后,代码编译时不会出现错误或警告。