我在一个不可变的类中实现了IXmlSerializable。为了保持类的不可变性,我显式地实现了接口,以便隐藏方法,并使用封装ReadXml(XmlReader reader)方法的静态ReadXml()方法,而不是返回类的新实例。然而,假设类名为ClassA,我被迫实现IXmlSerializable的方式意味着语句
((ClassA)((IXmlSerializable)(ClassAObject)).ReadXml(reader))
实际上改变了ClassAObject,因为在IXmlSerializable.ReadXml中,我将赋值给已经创建的对象的参数。也就是说,ClassAObject仍然可以被认为是不可变的吗?
发布于 2011-06-29 18:51:51
不是的。
显式实现接口并不是为了“隐藏”方法--只是为了避免两个接口定义具有相同签名的成员时的多义性。“隐藏”方面也是有用的,但只是为了防止你自己的代码中的错误-你必须显式地转换对象,这意味着你知道你在做什么。
补充道:然而,...也许你可以通过在ReadXml()被调用后“锁定”一个不可变对象来接近它,所以进一步调用它会抛出一个异常。因此,对象在被读取之后就变得不可变了。如果对象是由另一个构造函数构造的,而不是由无参数构造函数构造的,那么锁定对象就更好了。这取决于你为什么首先想要不变性,这可能满足你的需要。
发布于 2011-11-12 15:28:10
我认为您应该考虑数据传输对象(DTO),它将具有公共的getter/setter,仅用于传输序列化的对象数据。
https://stackoverflow.com/questions/6519419
复制相似问题