Java 当其他字段更新时,如何保证更新字段?
我有课Java 当其他字段更新时,如何保证更新字段?,java,Java,我有课 public class Order { private LocalDateTime creationDate; private Date creationDateAsDate; } creationDate是订单中的现有字段。 creationDateAsDate是一些功能的新字段 我需要在保存旧字段的所有位置设置并保存此新字段。 不幸的是,我使用的是遗留代码,我有5个地方设置了creationDate字段。 现在我看到两种解决方案: 在调用creationDatesett
public class Order {
private LocalDateTime creationDate;
private Date creationDateAsDate;
}
creationDate
是订单中的现有字段。
creationDateAsDate
是一些功能的新字段
我需要在保存旧字段的所有位置设置并保存此新字段。
不幸的是,我使用的是遗留代码,我有5个地方设置了creationDate
字段。
现在我看到两种解决方案:
creationDate
setter的所有位置调用creationDateAsDate
settercreationDate
setter中调用creationDateAsDate
setter我不喜欢这两种变体。有人能回答怎么做吗?它可能是我的一个变体,或者其他什么。因为这些是私有变量,所以请删除其中一个变量,例如
私有日期creationDateAsDate
和vaiable的setter
实现getter方法,如下所示
public Date getCreationDateAsDate(){
// convert the creationDate to date and return.
}
参考:要将
LocalDateTime
转换为Date,可以添加第三种方法(例如setCreationDateAsDateAndcreationDate),并在需要更新这两种方法时调用它。(as类应为扩展打开,但为修改关闭)。
然后把两个二传手都放进去
或
您可以从setCreationDateAsDate和setCreationDate调用新的setter方法(您在setters中创建另一个属性,然后调用第三个setter setCreationDateAsDate和CreationDate,同时将这两个日期作为参数传递给它)我建议更新这两个setter,这两个setter都没有错(这就是它们存在的原因)调用公共私有方法以避免无限递归
public void setCreationDate(LocalDateTime creationDate) {
Date creationDateAsDate = Date.from(creationDate.atZone(ZoneId.systemDefault())
.toInstant());
updateDates(creationDate, creationDateAsDate);
}
选择2似乎是正确的方式,但如果您不共享您提到的完整代码,则很难说。您发现的是setter的一个基本问题:它们旨在封装数据访问,但不提供任何抽象。每个人都希望setCreationDate
只设置创建日期,但创建setter是为了允许其他操作(即使99%的时间它只设置时间)。这是新字段的java.util.date
?那没有任何意义。而且,如果它本质上与旧字段相同,为什么还要有一个字段呢?只需添加一个使用另一个字段值的getter。设置一个字段值而不设置另一个字段值的setter的用例是什么?为什么你们的类有两个setter,而不是只有一个setter更新两个字段?@joachimsauer是的,我知道。这就是我问这个问题的原因。我们在DB中有一个字段。它的类型是由我们创建的。说来话长。MongoDB+LocalDate。我们创建了LocalDate(不是我,而是我们的开发人员)。现在我们要比较日期,如大于和小于。我们决定创建一个新字段,并将日期存储在存储旧字段的位置。
public void setCreationDateAsDate(Date creationDateAsDate) {
LocalDateTime creationDate = LocalDateTime.ofInstant(
creationDateAsDate.toInstant(),
ZoneId.systemDefault());
updateDates(creationDate, creationDateAsDate);
}
private void updateDates(LocalDateTime creationDate, Date creationDateAsDate) {
this.creationDate = creationDate;
this.creationDateAsDate = creationDateAsDate;
}