问题标签 [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 - 带有通配符的 java 泛型
有人可以用通配符向我解释 Java 泛型中扩展和超级之间的区别吗?
我已阅读相关帖子并没有完全理解。如果你能用实时的例子来解释我,那对我会有很大的帮助。
PECS(生产者你扩展,消费你使用超级)是什么意思?
java - Eclipse 中泛型类型的自动完成
正如 Effective Java 中提到的,“通过接口引用对象”是一个很好的实践。所以例如我更喜欢
超过
在我的代码中。一件烦人的事情是,如果我ArrayList<String> al = new
在 Eclipse 中键入然后按 Ctrl+Space,我会得到ArrayList<String>()
建议。但是,如果我键入 List al = new 然后按 Ctrl+Space 我将只得到定义匿名内部类的建议,而不是诸如new ArrayList<String>()
99% 的情况或例如 new 之类的建议Vector<String>()
。
问题:有没有办法让子类作为泛型类型的建议?
java - 了解在 Java 中创建非静态成员类,如 Effective Java 书中所述
以下来自有效的Java:
非静态成员类实例与其封闭实例之间的关联是在创建前者时建立的;之后无法修改。通常,通过从封闭类的实例方法中调用非静态成员类构造函数来自动建立关联。虽然很少见,但可以使用表达式 enclosingInstance.new MemberClass(args) 手动建立关联。如您所料,关联占用了非静态成员类实例中的空间并增加了构建时间。
Bloch 在这里所说的“虽然很少见,但可以使用表达式 enclosureInstance.new MemberClass(args) 手动建立关联。正如您所期望的那样,关联占用了非静态成员类实例中的空间并增加了时间它的构造。” ?
java - 将一些代码放在 try catch 块中以什么方式可以阻止 JVM 进行优化?
来自Effective Java 中的异常章节:
将代码放在 try-catch 块中会抑制现代 JVM 实现可能执行的某些优化
为什么以及如何使用 try-catch 块阻止 JVM 进行优化?
java - 了解 Effective Java 记录未检查异常的技巧
来自 Effective Java “记录所有方法抛出的异常”
应该注意的是,记录每个方法可以抛出的所有未经检查的异常是一种理想,在现实世界中并不总是可以实现。当一个类进行修订时,如果修改导出的方法以引发额外的未经检查的异常,则不违反源代码或二进制兼容性。假设一个类调用另一个独立编写的类的方法。前一个类的作者可能会仔细记录每个方法抛出的所有未经检查的异常,但是如果修改后一个类以抛出额外的未经检查的异常,那么前一个类(没有经过修订)很可能会传播新的未经检查的异常,即使它没有声明它们。
我不明白以前的班级如何传播新的未经检查的例外?Java 语言不要求调用者捕获和传播未经检查的异常。
java - 有效的Java。可克隆接口
我阅读了 Effective Java 书,但不理解解释 Clonable 接口的一段。有人可以解释一下这一段吗:
...程序员假设如果他们扩展一个类并
super.clone
从子类调用,返回的对象将是子类的一个实例。超类可以提供此功能的唯一方法是返回通过调用super.clone
. 如果一个克隆方法返回一个由构造函数创建的对象,那么它将具有错误的类。
谢谢。
java - 如何使用整数溢出来违反 Comparable 接口的第一条规定?
java.lang.Comparable#compareTo
方法规定为第一条
实现者必须确保所有 x 和 y 的 sgn(x.compareTo(y)) == -sgn(y.compare-To(x))。(这意味着当且仅当 y.compareTo(x) 抛出异常时,x.compareTo(y) 必须抛出异常。)
并根据 Joshua Bloch 在 Effective Java 中的第 12 项
这个技巧在这里工作得很好,但应该非常小心地使用。不要使用它,除非您确定所讨论的字段是非负的,或者更一般地说,最低和最高可能字段值之间的差异小于或等于 Integer.MAX_VALUE (231-1)。这个技巧并不总是有效的原因是一个有符号的 32 位整数不足以容纳两个任意有符号的 32 位整数之间的差异。如果 i 是一个大的正整数,而 j 是一个大的负整数,(i - j) 将溢出并返回一个负值。生成的 compareTo 方法将针对某些参数返回不正确的结果,并违反 compareTo 合同的第一和第二条规定。这不是一个纯粹的理论问题:它在实际系统中引起了故障。这些故障可能难以调试,
如果整数溢出,您可能会违反第一条规定,但我不知道如何,此示例显示了如何违反第一条规定:
所以我想要一个value1
和一个value2
来得到那个?任何想法?还是约书亚错了?
java - 我需要让所有类不可变吗?
我读了 Effective Java,并写了
如果一个类不能成为不可变的,则尽可能限制它的可变性......
和
...使每个字段都成为最终的,除非有令人信服的理由使它成为非最终的。
所以我需要让我所有的 POJO(例如简单的Book
类ID
,Title
和Author
字段)类不可变吗?当我想改变我的对象的状态时(例如用户在代表许多书籍的表中改变它),而不是设置器使用这样的方法:
但我的东西真的不是好主意..
请解释一下何时使类不可变。
java - 在核心 Java 中的其他相关类中共享不可变类的内部结构的示例
不可变类的众多优点之一是它们的内部实际上可以在其他相关类中以某种方式共享。
核心 java 库中可以引用什么作为这种技术的示例?为什么这项技术有效?
编辑:这实际上是在甲骨文采访中问到我的。
java - 说 int 枚举模式是编译时常量是什么意思?
这是来自有效的Java
使用 int 枚举模式的程序很脆弱。因为 int 枚举是编译时常量,所以它们被编译到使用它们的客户端中。
有人可以解释为什么 int 枚举模式被称为编译类型常量以及编译到客户端中的含义是什么?
这是一个这样的常数的例子: