Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当其他字段更新时,如何保证更新字段?_Java - Fatal编程技术网

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
    setter
  • creationDate
    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;
    }