Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.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_Design Patterns - Fatal编程技术网

在java中动态选择要更新的字段

在java中动态选择要更新的字段,java,design-patterns,Java,Design Patterns,我有一个Java 8类,比如: class state { LocalDateTime date1; LocalDateTime date2; LocalDateTime date3; LocalDateTime date4; LocalDateTime date5; } 根据特定条件,我必须选择一个日期字段,以使用utc时间更新它。我必须创建这个类的一个实例,每次更新一个字段,其余字段将为空 我可以这样做,但我想知道是否有任何优雅的方式来实现这一点。这里的状态

我有一个Java 8类,比如:

class state
{
   LocalDateTime date1;
   LocalDateTime date2;
   LocalDateTime date3;
   LocalDateTime date4;
   LocalDateTime date5; 
}
根据特定条件,我必须选择一个日期字段,以使用utc时间更新它。我必须创建这个类的一个实例,每次更新一个字段,其余字段将为空

我可以这样做,但我想知道是否有任何优雅的方式来实现这一点。这里的状态是一个枚举

   switch case(status)
   case "1"
     new state(UTC.now, null,null, null, null);
   case "2"
     new state(null, UTC.now, null, null, null);

一旦您决定创建单独的字段,您就失去了优雅地执行此操作的能力

class State {
    List<LocalDateTime> dates = new ArrayList<>();
}
然后:
states.put(status,…)


在这方面还有很多想法。

一旦您决定创建单独的字段,您就失去了优雅地执行此操作的能力

class State {
    List<LocalDateTime> dates = new ArrayList<>();
}
然后:
states.put(status,…)


在这方面还有很多想法。

一个不将日期字段更改为集合的想法

将开关置于状态构造函数中:

public State(Status stat) {
    switch case(stat)
    case one:
        date1 = UTC.now;
        break;
    case two:
        date2 = UTC.now;
        break;
    ...
}
我假设
状态
看起来像这样:

enum Status {
    one(1), two(2);

    private int stat;
    private Status(int stat) {
        this.stat = stat;
    }
    public String toString() {
        return String.valueOf(this.stat);
    }
}

不将日期字段更改为集合的想法

将开关置于状态构造函数中:

public State(Status stat) {
    switch case(stat)
    case one:
        date1 = UTC.now;
        break;
    case two:
        date2 = UTC.now;
        break;
    ...
}
我假设
状态
看起来像这样:

enum Status {
    one(1), two(2);

    private int stat;
    private Status(int stat) {
        this.stat = stat;
    }
    public String toString() {
        return String.valueOf(this.stat);
    }
}

生成器设计模式有用吗

class stateBuilder {

    LocalDateTime date1;
    LocalDateTime date2;
    LocalDateTime date3;
    LocalDateTime date4;
    LocalDateTime date5;

    public stateBuilder setDate1(int date) {
                this.date1= date;
        return this;
    }

    public stateBuilder setDate2(int date) {
                this.date2= date;
        return this;
    }
    // So on for other instance members

    public state build() {
        return  new State(date1,date2,date3,date4,date5);
    }
}
你可以打电话:

State s = new stateBuilder().setDate1(UTC.now).build();

生成器设计模式有用吗

class stateBuilder {

    LocalDateTime date1;
    LocalDateTime date2;
    LocalDateTime date3;
    LocalDateTime date4;
    LocalDateTime date5;

    public stateBuilder setDate1(int date) {
                this.date1= date;
        return this;
    }

    public stateBuilder setDate2(int date) {
                this.date2= date;
        return this;
    }
    // So on for other instance members

    public state build() {
        return  new State(date1,date2,date3,date4,date5);
    }
}
你可以打电话:

State s = new stateBuilder().setDate1(UTC.now).build();

考虑使用映射来查找/替换相关实例。如果多个条件指向同一个实例,那么可以使用多键映射。考虑使用映射来查找/替换相关实例。如果多个条件指向同一个实例,那么可以使用多键映射。您的第一个想法很好,但是在这里使用反射只是自找麻烦。我建议对答案进行编辑,以消除这种情况;你失去了类型安全性,你正在“严格输入”你的变量,“在IDE中查找引用”脚本无法工作,一般来说,它只是一种气味。“你正在“严格输入”你的变量,“在IDE中查找引用”脚本”——你可以对使用集合的解决方案说同样的话。您只知道在运行时设置的日期(1、2、3等)。理想情况下,他不会有5个单独的日期对象,我会使用你的一个解决方案。不,你不能对集合说同样的话。毕竟,唯一可以问“您在哪里访问”这个问题的字段是集合,IDE会给出正确的答案。与反射情况相比,你确实有一个字段,但是问这个问题会给出错误的答案。你的第一个想法很好,但是在这里使用反射只是自找麻烦。我建议对答案进行编辑,以消除这种情况;你失去了类型安全性,你正在“严格输入”你的变量,“在IDE中查找引用”脚本无法工作,一般来说,它只是一种气味。“你正在“严格输入”你的变量,“在IDE中查找引用”脚本”——你可以对使用集合的解决方案说同样的话。您只知道在运行时设置的日期(1、2、3等)。理想情况下,他不会有5个单独的日期对象,我会使用你的一个解决方案。不,你不能对集合说同样的话。毕竟,唯一可以问“您在哪里访问”这个问题的字段是集合,IDE会给出正确的答案。与反射情况相比,你确实有一个字段,但是问这个问题会给出错误的答案。