effective-java相关内容

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

我正在阅读关于Effective Java中的序列化一章. 谁调用了 readObject() 和 writeObject()?为什么这些方法被声明为私有的? 下面是书中的一段代码 //StringList 带有合理的自定义序列化形式公共最终类 StringList 实现了 Serializable {私有瞬态整数大小 = 0;私人瞬态条目头 = 空;//其他代码私有无效 write ..
发布时间:2021-12-21 22:19:24 Java开发

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

我正在阅读关于 Effective Java 中泛型的章节. 帮助我理解Set、Set和Set? 之间的区别 以下段落摘自书中. 快速回顾一下,Set 是一个参数化类型,表示set 可以包含任何类型的对象,Set 是通配符类型表示只能包含某些未知对象的集合类型,而 Set 是原始类型,它选择退出泛型类型系统. “某种未知类型"是什么意思?都是Object 类型的未知类型吗?在 ..
发布时间:2021-12-15 10:03:38 Java开发

为什么有时在泛型方法的定义中省略了返回类型之前的尖括号

我正在阅读有效Java第五章中有关泛型的内容,特别是有关偏爱泛型方法的项目.我注意到有时有时会省略返回类型之前的方法声明中的类型参数(在尖括号之间).有很多类似的情况,但是例如在第二版的第135页上: public void popAll(Collection dst){而(!isEmpty())dst.add(pop());} 另一方面,我在声明中看到了类似的通用方法 pub ..
发布时间:2021-05-10 18:47:10 Java开发

在Java中不可变

在有效的Java 中,Bloch建议将所有字段最终确定为对象不可变. 是否有必要这样做?不只是不提供访问器方法就使其不可变. 例如 class A { private int x; A (int x) { this.x = x; } } 即使我没有将x声明为final,上述类也是不可变的?我想念什么吗? 解决方案 ..
发布时间:2020-06-13 19:01:20 Java开发

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

可爱的等于和哈希码,所有的理论都在此处和也在此处 我决定在多个休眠实体/域对象的equals()和hashcode()中使用自动生成的ID. 但是,许多网站都说您不应该这样做,因为存在在比较对象或使用哈希码的过程中将对象第一次持久保存到数据库中的风险. 我的观点是,在大多数用例中,这比其他任何要更改的字段都不太可能. 单个域对象在首次创建时具有一次生成的ID,而几乎每个其他 ..
发布时间:2020-06-13 19:01:09 Java开发

使用工厂方法了解JDBC之类的服务提供程序框架背后的概念

来自有效的Java (项目1 :考虑静态工厂方法而不是构造函数): 由静态工厂方法返回的对象的类甚至不需要存在 在编写包含该方法的类时.如此灵活的静电工厂 方法构成服务提供者框架(例如Java数据库)的基础 连接性API(JDBC).服务提供商框架是一种系统,其中 多个服务提供商实施一项服务,然后系统进行实施 对客户可用,将他们与实现脱钩. 我特别不明白为什么书说的是静态工厂方法返回的 ..
发布时间:2019-09-02 13:15:55 Java开发

有效的Java项目11:明智地覆盖克隆

对于带有数组字段的类,Josh说如果clone方法只返回super.clone(),则生成的类实例将在原始字段中具有正确的值,但其数组字段将引用与原始字段相同的数组类实例。修改原始文件会破坏不变量,反之亦然。 他使用了自定义Stack实现的例子,我使用的是一个简单的Student类 class Student实现Cloneable { private String name; ..
发布时间:2019-01-08 13:05:37 Java开发

Builder模式:首选哪种变体?

我正在阅读Effective Java书籍,并为我未来的参考创建笔记, i遇到了Builder Pattern。 我明白它是什么,它是如何使用的。在这个过程中,我创建了两个构建模式的示例变体。 我需要帮助列出差异和每个人的优势? 嗯我当然注意到,示例1 暴露的方法较少,限制较少, 更通用,允许更灵活地使用。 请指出我错过的其他事情? 示例1 package i ..
发布时间:2018-12-28 15:09:26 Java开发

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

我正在阅读“Effective Java”中的序列化章节。我试图理解书中的以下段落。 如果你实现一个具有可序列化的实例字段的类 和可扩展的,你应该注意的是谨慎。如果 类 有不变量,如果它的实例字段 是 初始化为它们的默认值(整数类型为0,boolean为 false,并且null为对象引用类型),你 必须将 这个readObjectNoData方法添加到类中: //有 ..
发布时间:2018-12-25 22:17:22 Java开发

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

有效的java说: //潜在的安全漏洞! static public final Thing [] VALUES = {...}; 有人可以告诉我什么是安全漏洞吗? 解决方案 声明静态最终公开字段通常是类常量的标志。对于原始类型(整数,双精度等)和不可变类,如字符串和 java.awt.Color ,它完全没问题。对于数组,问题是即使数组引用是常量,数组的元素仍然可以更改 ..
发布时间:2018-12-25 21:08:05 Java开发

Java:为什么不将clone()用于防御性复制?

在Effective Java(第7章)中,它说 另请注意,我们没有使用Date的克隆方法来制作防御性副本。因为Date是非最终的,所以不能保证clone方法返回一个类为java.util.Date的对象:它可能返回一个专门为恶意恶作剧设计的不可信子类的实例。例如,这样的子类可以在创建私有静态列表时记录对每个实例的引用,并允许攻击者访问该列表。这将使攻击者在所有实例中自由统治。为了防止这种攻 ..
发布时间:2018-12-20 23:27:32 Java开发

有效的Java项目47:了解并使用您的库 - 有缺陷的随机整数方法示例

在Josh给出的有缺陷的随机方法的例子中,该方法生成一个带有给定上限 n 的正随机数,我不明白他的两个缺点这个方法是: private static final Random rnd = new Random(); //常见但有很大缺陷 static int random(int n){ return Math.abs(rnd.nextInt())%n; } ..

Joshua Bloch在有效的java中建议如何在Java中使用缓存哈希码?

我有以下来自Joshua Bloch的有效java代码(第9章,第3章,第49页) 如果a class是不可变的,并且计算哈希代码的成本是 很重要,您可以考虑在对象 中缓存哈希代码,而不是每次请求时重新计算它。如果您认为 将此类型的大多数对象用作哈希键,那么 应该在创建实例时计算哈希码。 否则,您可能会在第一次调用 hashCode时选择懒惰地初始化它(第71项)。目前尚不清楚我 ..
发布时间:2018-12-06 14:15:30 Java开发

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

可爱的equals和hashcode,所有的理论都是 here 和也此处 我决定在一些hibernate实体/域对象中使用equals()和hashcode()中的自动生成的id。然而,许多网站表示,你永远不应该这样做,因为在第一次存在对象的过程中存在持久化对象到数据库的风险比较或使用散列码。 我的观点是,在大多数使用情况下,这比任何其他字段更改的可能性要小得多。 个别域对象的i ..
发布时间:2018-06-07 18:13:49 Java开发