在"Effective Java,2nd edition"一书的第2项中,有一段代码,其中作者想要禁止对象的空初始化.
class Example {
private Example() {
throw new AssertionError();
}
}
Run Code Online (Sandbox Code Playgroud)
抛出的异常类型让我感到困惑.
我不明白是否AssertionError因为缺少更合适的错误而抛出,或者因为它应该是这样的.
据我所知,当assert语句失败时,框架会抛出此错误.另外,在javadoc中它只是写的
[AssertionError]抛出,表示断言失败.
但我没有看到任何断言(真假陈述)在这里被侵犯.当然,"你不应该实例化这个类的一个项目"的声明已被违反,但如果这是背后的逻辑,那么我们都应该把它扔到AssertionError各处,这显然不会发生什么.
FWIW,我刚刚抛出一个
new IllegalStateException("Must not instantiate an element of this class")
Run Code Online (Sandbox Code Playgroud)
这有什么问题吗?在这种情况下AssertionError,我应该在我自己的代码中抛出一个?
很抱歉,如果这只是一个微妙的疑问,但我在代码中使用了这种模式,我想确保我做的正确.
有效的java说:
//潜在的安全漏洞!
static public final Thing [] VALUES = {...};
谁能告诉我什么是安全漏洞?
我正在阅读有效Java中的序列化一章.
谁调用了readObject()和writeObject()?为什么这些方法被声明为私有?
以下是本书的一段代码
// StringList with a reasonable custom serialized form
public final class StringList implements Serializable {
private transient int size = 0;
private transient Entry head = null;
//Other code
private void writeObject(ObjectOutputStream s)
throws IOException {
s.defaultWriteObject();
s.writeInt(size);
// Write out all elements in the proper order.
for (Entry e = head; e != null; e = e.next)
s.writeObject(e.data);
}
}
}
Run Code Online (Sandbox Code Playgroud)
是否有任何特定原因将变量size声明为瞬态,然后在writeObject方法中显式写入?如果它没有被宣布为瞬态,那么无论如何都会写出来,对吗?
我正在阅读有效Java中关于泛型的章节.
帮助我理解之间的区别Set,Set<?>以及Set<Object>?
以下段落摘自本书.
作为快速回顾,
Set<Object>是一个参数化类型,表示一个可以包含任何类型的对象的集合,Set<?>是一个表示一个集合的通配符类型,它只能包含某些未知类型的对象,并且Set是一个原始类型,它选择了泛型类型系统.
什么是"某种未知类型"?是所有未知类型的类型Object?在那种情况下,Set<?>和之间的具体区别是Set<Object>什么?
我正在阅读"Effective Java"中的序列化章节.我试图理解书中的下一段.
如果您实现的类具有可序列化和可扩展的实例字段,那么您应该注意这一点.如果类的实例字段初始化为其默认值(整数类型为零,布尔值为false,对象引用类型为null),则会违反不变量,必须将此readObjectNoData方法添加到类中:
// readObjectNoData for stateful extendable serializable classes
private void readObjectNoData() throws InvalidObjectException {
throw new InvalidObjectException("Stream data required");
}
Run Code Online (Sandbox Code Playgroud)
我不确定上述陈述的含义.
为了测试这个,我创建了一个Person类(可序列化和可扩展)
class Person implements Serializable{
private String name;
private int age;
Person() {
this("default",1);
}
Person(String name, int y) {
this.name = name;
this.age = y;
}
}
Run Code Online (Sandbox Code Playgroud)
以及扩展它的类Employee.
class Employee extends Person {
String address ;
public Employee()
{
super();
address ="default_address";
}
public Employee(String name , int age, String address)
{
super(name,age);
this.address = address; …Run Code Online (Sandbox Code Playgroud) 我正在阅读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的不可实例化的类中.
任何人都可以向我指出明显的事吗?
什么是他说的意思
返回对象的类都是非公共的
这是我获取java源代码的地方:http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/Collection.java?av = f
从Effective Java(第1项:考虑静态工厂方法而不是构造函数):
在编写包含该方法的类时,静态工厂方法返回的对象的类甚至不需要存在.这种灵活的静态工厂方法构成了服务提供者框架的基础,例如Java数据库连接API(JDBC).服务提供者框架是多个服务提供者实现服务的系统,并且系统使实现可用于其客户端,从而将它们与实现分离.
我特别不明白为什么这本书说的是静态工厂方法返回的对象的类在编写包含该方法的类时甚至不需要存在?有人可以解释使用JDBC作为示例.
我正在阅读有效Java [第27项]中关于泛型的章节.
书中有这一段:
允许(尽管相对罕见)类型参数受涉及该类型参数本身的某个表达式的限制.这就是所谓的递归类型绑定.
还有这个:
// Using a recursive type bound to express mutual comparability
public static <T extends Comparable<T>> T max(List<T> list) {...}
Run Code Online (Sandbox Code Playgroud)
什么是递归类型绑定以及上面的代码如何帮助实现相互可比性?
我知道你是否做到了
for (condition) {
String s = "hi there";
}
Run Code Online (Sandbox Code Playgroud)
只是一个String实例在所有的迭代创建的,不像String s = new String("hi there");是会在每次迭代中创建一个新的实例.
但是,阅读约书亚布洛赫的有效Java:第2章第5章(第20页),它指出:
此外,保证对象将被在同一虚拟机中运行的任何其他代码重用,这些代码恰好包含相同的字符串文字[JLS,3.10.5].
不说的AFAIK 恰好是相同的字符串文字,它说包含.
阅读[JLS,3.10.5]无法找到任何确切的参考,我有一个疑问.
给这个片段:
String s1 = "hi ";
String s2 = "there";
String s3 = "hi there";
Run Code Online (Sandbox Code Playgroud)
创建了多少个实例?
s1然后s2(然后s3创建重用s1和s2引用)我正在阅读" Effective Java ".
他说,在关于敲定的讨论中
C++析构函数也用于回收其他非内存资源.在Java中,try finally块通常用于此目的.
什么是非内存资源?
数据库连接是非内存资源吗?持有数据库连接的对象是否占用了一些内存?