在java中动态选择要更新的字段
我有一个Java 8类,比如:在java中动态选择要更新的字段,java,design-patterns,Java,Design Patterns,我有一个Java 8类,比如: class state { LocalDateTime date1; LocalDateTime date2; LocalDateTime date3; LocalDateTime date4; LocalDateTime date5; } 根据特定条件,我必须选择一个日期字段,以使用utc时间更新它。我必须创建这个类的一个实例,每次更新一个字段,其余字段将为空 我可以这样做,但我想知道是否有任何优雅的方式来实现这一点。这里的状态
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会给出正确的答案。与反射情况相比,你确实有一个字段,但是问这个问题会给出错误的答案。