динамически выбрать поле для обновления в java - PullRequest
0 голосов
/ 24 апреля 2020

У меня есть класс в Java 8, например:

class state
{
   LocalDateTime date1;
   LocalDateTime date2;
   LocalDateTime date3;
   LocalDateTime date4;
   LocalDateTime date5; 
}

В зависимости от определенных условий мне придется выбрать одно из полей даты, чтобы обновить его с временем ut c. Я должен создать экземпляр этого класса, обновляя 1 поле за раз, остальные поля будут пустыми.

Я могу сделать, как показано ниже, но мне интересно, есть ли какой-нибудь элегантный способ добиться этого. здесь статус enum.

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

Ответы [ 3 ]

2 голосов
/ 24 апреля 2020

После того, как вы приняли решение сделать отдельные поля, вы потеряли способность делать это элегантно.

class State {
    List<LocalDateTime> dates = new ArrayList<>();
}

теперь это может быть просто: state.getDates().set(Integer.parseInt(status), ...);

If ' status 'не число, возможно:

class State {
    Map<String, LocalDateTime> dates = new HashMap<>();
}

, а затем: states.put(status, ...);

В этом ключе есть еще много идей.

0 голосов
/ 24 апреля 2020

Полезен ли шаблон проектирования Builder?

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();
0 голосов
/ 24 апреля 2020

Идея без изменения ваших полей даты в коллекцию ...

Поместите переключатель в конструктор состояний:

public State(Status stat) {
    switch case(stat)
    case one:
        date1 = UTC.now;
        break;
    case two:
        date2 = UTC.now;
        break;
    ...
}

Я предполагаю, что Status выглядит примерно так :

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

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