一直试图找到实现制作Calendar对象防御性副本的方法的最佳方法.
例如:
public void setDate(Calendar date) {
// What to do....
}
Run Code Online (Sandbox Code Playgroud)
我特别关注在检查空输入和制作副本时是否存在线程交错,还是我错过了一些非常明显的东西?
我是一名长期 C/C++ 程序员,正在学习 Java。我读过有关通过使用返回对私有字段的引用的访问器方法来破坏封装的问题。标准的Java解决方案似乎是防御性复制——调用复制构造函数或clone()来创建字段的副本并返回对该副本的引用。我不明白为什么没有人担心制作防御性副本的低效率。在 C++ 中,访问器只会返回一个指向 const 的指针,从而保护私有成员而不进行复制。为什么Java没有const引用?
如何制作包含不可变对象中可变字段的可变对象的防御性副本?
class ImmutableObject {
private final MutableObject immutable_field;
ImmutableObject(MutableObject y) {
this.immutable_field = y;
}
}
class MutableObject {
public int mutable_field;
}
Run Code Online (Sandbox Code Playgroud)
我有一个关于创建Immutable类的查询.以下是我考虑的要点:
但是我根本不完全理解这一点,你能告诉或给我一个例子,其中5点在这个例子中是清楚的吗?
我有以下代码:
private static final ImmutableMultimap<String, String> namesToAddress;
public static List<String> getAddresses(String name){
return ImmutableList.copyOf(namesToAddress.get(name));
}
Run Code Online (Sandbox Code Playgroud)
我的问题是防御性copyOf()在这里是必要的,因为get()仍然返回一个不可变列表?
注意我正在使用Google Guava的ImmutableMultiimap.
谢谢.