以下内容来自《Effective Java》:
非静态成员类实例与其封闭实例之间的关联是在创建前者时建立的;此后无法修改。通常,通过从封闭类的实例方法中调用非静态成员类构造函数来自动建立关联。尽管很少见,但可以使用表达式 enleadingInstance.new MemberClass(args) 手动建立关联。正如您所期望的,关联占用了非静态成员类实例中的空间并增加了其构造时间。
Bloch 在此所说的“虽然很少见,但可以使用表达式 enleadingInstance.new MemberClass(args) 手动建立关联。正如您所期望的,该关联会占用非静态成员类实例中的空间并增加时间它的建设。” ?
我阅读了有效的Java书,并且不了解一个解释Clonable接口的段落.有人可以解释一下这段话:
程序员假设如果他们扩展一个类并
super.clone从子类调用 ,则返回的对象将是子类的一个实例.超类可以提供此功能的唯一方法是返回通过调用获得的对象super.clone.如果clone方法返回由构造函数创建的对象,则它将具有错误的类.
谢谢.
在"Effective Java,Second Edition"的第71项中,为了延迟实例化实例字段,引入了双重检查惯用语和单一检查用语.
仔细检查成语
private volatile FieldType field;
FieldType getField() {
FieldType result = field;
if (result == null) {
synchronized(this) {
result == field;
if (result == null)
field = result = computeFieldValue();
}
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
单一检查成语
private volatile FieldType field;
FieldType getField() {
FieldType result = field;
if (result == null) {
field = result = computeFieldValue();
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
在Joshua所述的复核习语中,结果变量用于确保仅读取一次volatile 字段,从而提高性能.我理解这一点,但是我不明白为什么我们在单一检查习语中需要它,因为我们只读过一次字段.
在Effective Java,第2版,第11项中,可以找到以下深层复制示例:
public class HashTable implements Cloneable {
private Entry[] buckets = ...;
private static class Entry {
final Object key;
Object value;
Entry next;
Entry(Object key, Object value, Entry next) {
this.key = key;
this.value = value;
this.next = next;
}
// Recursively copy the linked list headed by this Entry
Entry deepCopy() {
return new Entry(key, value,
next == null ? null : next.deepCopy());
}
}
@Override public HashTable clone() {
try {
HashTable result = (HashTable) super.clone(); …Run Code Online (Sandbox Code Playgroud) 从Effective Java的Serialization章节:
如果被反序列化的对象的类使用适当的声明定义了readResolve方法,则在反序列化后对新创建的对象调用此方法.
Effective Java中提供的示例如下所示,似乎Javadoc所说的throws部分是正确的格式,即ANY-ACCESS-MODIFIER Object readResolve() throws ObjectStreamException;
// readResolve for instance control - you can do better!
private Object readResolve () {
// Return the one true Elvis and let the garbage collector
// take care of the Elvis impersonator.
return INSTANCE;
}
Run Code Online (Sandbox Code Playgroud)
这里有适当的声明是什么意思?如果声明不合适,课程是否会编译?我发现这句话有点令人困惑.
我正在阅读Effective java item# 2- Builder模式
http://www.informit.com/articles/article.aspx?p=1216151&seqNum=2
这里说的是java bean并不是创建多参数对象的有效方法。但是如果我这样有javabean怎么办:
// JavaBeans Pattern
public class NutritionFacts {
private final int servingSize ;
private final int servings ;
private final int calories;
private final int fat;
private final int sodium;
private final int carbohydrate;
public NutritionFacts() { }
// Setters
public void setServingSize(int val) { servingSize = val; }
public void setServings(int val) { servings = val; }
public void setCalories(int val) { calories = val; }
public void setFat(int val) { fat …Run Code Online (Sandbox Code Playgroud) 我刚刚阅读了Bloch的Effective Java,有一节讨论了泛型章节中的"身份功能".
public interface UnaryFunction<T> {
T apply(T arg);
}
// Generic singleton factory pattern
private static UnaryFunction<Object> IDENTITY_FUNCTION = new UnaryFunction<Object>() {
public Object apply(Object arg) { return arg; }
};
// IDENTITY_FUNCTION is stateless and its type parameter is
// unbounded so it's safe to share one instance across all types.
@SuppressWarnings("unchecked")
public static <T> UnaryFunction<T> identityFunction() {
return (UnaryFunction<T>) IDENTITY_FUNCTION;
}
Run Code Online (Sandbox Code Playgroud)
我已经读过"为什么禁止这种未经检查的警告是否安全?" 并且答案解释了未经检查的警告问题,但当身份功能似乎与身份无关时,让我对"身份功能"的概念完全不满意.
布洛赫只是假设我知道它是什么,但在他用来说明它的实现中,它与身份或身份无关.
我在维基百科上查了一下:身份函数@维基百科,但纯粹的理论描述并没有告诉我它与身份有什么关系.
我在google上搜索过,有些人将这些.equals()和.hashCode()方法称为身份函数,这有点意义,但当然它们的实现与Bloch的方法完全不同,后者返回输入参数不变.这与身份有什么关系?
其他人谈到数据库函数作为身份函数,在每次调用时给出一个新的ID,这也更有意义,但显然范围非常有限.
我正在阅读 Effective Java 和 Joshua Bloch 一书,在第 2 章中说:
静态工厂方法的第三个优点是,与构造函数不同,它们可以返回其返回类型的任何子类型的对象。
我不明白如何在实践中使用这个概念?
有人可以举个例子吗?
我记得读过一篇可能在Bloch的Effective Java中的部分,它说大多数情况下,在哪里
String a = "fish";
String b = "fish";
Run Code Online (Sandbox Code Playgroud)
在大多数情况下,a == b因为字符串是不可变的.但是由于临时构造对象或其他一些东西,新的String("fish")会产生一个独特的对象引用.
我通过Bloch章节了解了equals(),不变性和对象创建,但是找不到这一点我记得!! 撕掉我的头发,有没有人记得这是什么原因的描述?它甚至可能不在EJ中,但我想找到它.提示:这解释的是我的实际问题.