我们都熟悉不变性。一个非常简单的不可变类将是
final class Immutable {
public final float PI = 3.14;
}
这真的是一成不变的吗?Java开发人员真的不能修改PI吗?不,他们可以使用Reflection API进行访问和修改PI。但是,由于这是一种非常规的访问字段的方式,尽管通过反射API进行的修改可以被安全管理器阻止(对吗?),但是Immutable即使没有激活安全管理器,我们也说这是不可变的。
interface ImmutableName {
public String getName();
}
class MutableName implements ImmutableName {
private String name;
public String getName() { return name; }
public void setName(String val) { name = val; }
}
如果我将所有MutableName实例称为ImmutableName实例,则开发人员将进行修改name。实际上,开发人员可以检查实例的运行时实现,然后将实例转换为MutableName。Java中的向下转换比反射API更常见,但是它是否仍然是一些非正统的技巧?班级设计者是否应该防御性地编写代码以防止垂头丧气?
湖上湖
LEATH
相关分类