【发布时间】:2016-03-10 15:15:15
【问题描述】:
假设我有一个具有给定结构的类:
class Problem {
private String longString;
private String firstHalf;
private String secondHalf;
}
firstHalf 和 secondHalf 是从 longString 计算出来的,并在我的应用程序中广泛使用,但我不想序列化它们。现在,为了使这个对象的序列化工作,我需要一个 longString 的设置器。我想保护 firstHalf 和 secondHalf 是从 longString 计算的不变量,仅当 longString 存在且该值存在时才存在传递给 longString 在某种意义上是正确的,可以计算前半部分和后半部分。我目前的解决方案是让 longString 的设置器像这样编写:
public void setLongString(String value) {
this.longString=value;
this.firstHalf=computeFirstHalf(value);
this.secondHalf=computeSecondHalf(value);
}
此代码还暗示 longString 与前半部分和后半部分之间的紧密相关性。
然而,让我烦恼的一件事是,setLongString 方法实际上做了三件事,而且它的名称并不能反映它的真实行为。
有没有更好的编码方式?
编辑 1: 我正在使用 Jackson 到 json 序列化程序,并且我有上半场和下半场的吸气剂,并用 @JsonIgnore 注释。
我想表达 longString 和它的一半之间的紧密耦合。
【问题讨论】:
-
您是通过标准 java 序列化机制还是通过自定义序列化程序进行序列化?
-
如果你想序列化一个对象,但不希望在对象中序列化特定字段,将这些字段标记为瞬态`transient String something = "";'此外,无论如何,您确实应该将所有字段设为私有并提供适当的 getter/setter 方法。然后,您可以在您的 set 方法中检查字段是否已设置并且不重置值,或任何其他有意义的业务逻辑......这是面向对象设计的一个好处
-
我正在使用 Jackson 到 json 序列化程序。我的字段是私有的,我有 getter(被杰克逊忽略),我将编辑我的问题以表明这一点
标签: java serialization coding-style refactoring