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

java - 为什么公共静态最终数组是一个安全漏洞?

有效的java 说:

// 潜在的安全漏洞!

static public final Thing[] VALUES = { ... };

谁能告诉我安全漏洞是什么?

0 投票
2 回答
3012 浏览

java - How do I make defensive copy of an object?

How do I make defensive copies of a Mutable Object which contains a mutable field in an Immutable Object?

#xA;
  • The MutableObject does not have a constructor that lets me set the field.
  • The MutableObject's current state should be captured in the Immutable Object and never changed.
0 投票
3 回答
903 浏览

java - 有效的 Java 项目 1 适用于 TDD 和依赖注入

我一直在阅读 Effective Java,我对与 TDD 和依赖注入相关的第一项“使用静态工厂方法而不是构造函数”有一些担忧。

该项目说您应该避免使用公共/受保护/默认构造函数并使用静态工厂公开它。我同意与使用静态工厂相关的所有优点,例如工厂可以有名称、可以返回子类型、可以减少冗长等。但是,我认为 Joshua 错过了 TDD 的缺点,因为在您的代码中使用静态工厂会导致紧密耦合和你不能使用它来模拟类。我们将无法模拟将具有静态工厂的类。因此,它阻碍了测试驱动的开发。

第二点,我认为他错过了在当今的企业开发中,大多数应用程序都使用一个或另一个依赖注入容器。所以,当我们可以使用 DI 注入依赖项时,我为什么要使用它。

请解释它如何应用于当今包括 DI 和 TDD 的 Java 企业开发。

0 投票
3 回答
470 浏览

java - 这个类是完全不可变的吗?

我正在尝试按照 Effective Java Item 15 (Minimize Mutability) 中给出的建议将可变类转换为不可变类。谁能告诉我我创建的类是否完全不可变?

可变类

字段类

不可变类

谢谢

谢卡尔

0 投票
1 回答
695 浏览

java - 对类之间共享的相关常量进行分组

在 Effective Java 第 17 条中,Josh Bloch 认为将静态成员放入接口(并实现该接口)是一种不好的做法,称为常量接口反模式

常量接口模式是接口使用不当。一个类在内部使用一些常量是一个实现细节。实现一个常量接口会导致这个实现细节泄漏到类的导出 API 中。类实现一个常量接口对类的用户来说无关紧要。事实上,它甚至可能使他们感到困惑。更糟糕的是,它代表了一种承诺:如果在未来的版本中修改了类以使其不再需要使用常量,它仍然必须实现接口以确保二进制兼容性。如果一个非最终类实现了一个常量接口,那么它的所有子类的命名空间都会被接口中的常量污染。

Java 平台库中有几个常量接口,例如 java.io.ObjectStreamConstants. 这些接口应被视为异常,不应被模仿。

我非常有信心我理解这背后的原因并完全同意。

我的问题是:在接口与不可实例化类中对相关常量进行分组(注意:这些不适合枚举,请考虑相关常量 pi 和 e 的数学示例)是一个好主意,前提是您只访问这些值通过静态引用和静态导入,使用默认访问修饰符将接口隐藏在您的 API 中,并且从不实际实现接口

为什么或者为什么不?除了能够使用私有构造函数来确保永远不会实例化常量分组类型之外,将它们分组到一个类中还有什么好处吗?

0 投票
1 回答
87 浏览

java - 向超类添加新方法并产生问题 - 可能性?

Effective Java 2nd edition 的第 16 条,赞成组合胜过继承说以下

“如果超类在后续版本中获得了一个新方法,而你不幸给子类一个具有相同签名和不同返回类型的方法,那么你的子类将不再编译。

如果您为子类提供了与新超类方法具有相同签名和返回类型的方法,那么您现在正在覆盖它”

这些案例在现实世界中出现的可能性有多大?这里的任何人都可以给我一个真实商业应用程序的例子(如果需要,删除专有信息)?

0 投票
3 回答
647 浏览

java - Java 序列化

我发布了一个疑问,即我读到了 Effective Java。如果这是一个真正简单直接的疑问,我深表歉意。所以在第 74 条 - 明智地实现 Serializable中,他是说即使在使用私有和包私有字段在您的类上实现了良好的信息隐藏之后,它也容易失去效力?无论我过去读到什么,序列化所做的都是将对象转换为字节流形式,并在反序列化后保留相同的对象。在这个过程中它是如何丢失数据隐藏的?

0 投票
4 回答
1122 浏览

java - Java 按通用类型存储条件

我一直在阅读 Effective Java 并决定尝试将我学到的一些知识付诸实践。我正在尝试有效地创建一个Multimap<?, Condition<?> > 通配符对于键和值来说都是相同类型的,但它将是不同的、不同的类型。

这是我正在看的书中的项目:项目 29

我不想完全复制它。我意识到最大的区别是键不直接代表链接中的值。在我看来,键代表值的通用类型。

因此,mmap.put(Class<Integer>, ConditionMapping<Integer>) 当我执行 get 时,我没有 ConditionMapping 的泛型类型,所以我会收到 unchecked cast 警告。

我有一个我想要签名的 get 方法<T> List<Condition <T> >(Class<T> type)

由于类型擦除,我唯一的选择是确保 condition.value 是 T 类型并构建新的对象列表吗?

我可以忽略未经检查的演员表警告,但我只是尽量不这样做。有什么建议么?提示?诡计?

0 投票
6 回答
13257 浏览

java - 有效的 Java 由 Joshua Bloch:Item1 - 静态工厂方法

我正在阅读Effective JavaJoshua Bloch 的文章,我对 Item1 有疑问Static Factory Method

引用[布洛赫,第 7 页]

接口不能有静态方法,因此按照惯例,名为 Type 的接口的静态工厂方法放在名为 Types 的不可实例化类中。例如,Java Collections Framework,提供不可修改的集合、同步的集合等。几乎所有这些实现都是通过一个不可实例化的类 (java.util.Collections) 中的静态工厂方法导出的。返回对象的类都是非公开的。

好的。查看源代码时,我看到带有私有构造函数(不可实例化的类)的java.util.Collection接口和类。java.util.Collections而且我看到不可实例化的类 Collections 具有所有静态方法,就像 Bloch 所说的那样。但我看不到布洛赫所说的两个班级之间的联系

接口不能有静态方法,因此按照惯例,名为 Type 的接口的静态工厂方法放在名为 Types 的不可实例化类中。

  1. 任何人都可以向我指出显而易见的事情吗?

  2. 他说的时候是什么意思

返回对象的类都是非公开的

这是我获得java源代码的地方:http ://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/Collection.java?av=f

0 投票
2 回答
200 浏览

java - 类管理自己的内存

有效的 Java:第 6 项:消除过时的对象引用。

一般来说,每当一个类管理自己的内存时,程序员都应该警惕内存泄漏。每当一个元素被释放时,该元素中包含的任何对象引用都应该被清空。

我认为我没有完全理解描述。

管理自己的内存的类的例子是什么 - 我可以想到数组,列表,也许是映射。

任何人都可以更详细地解释书中的项目吗?谢谢