Упрощение выражения переключения, которое обновляет закрытый элемент

#java #switch-statement #mapping

#java #switch-statement #сопоставление

Вопрос:

Я хочу упростить эту логику:

   private String member_A;
  private String member_B;
  private String member_C;
  private String member_D;

 private void xyz(Object x, String s) {
 switch (s) {
    case "A":
      member_A = x.getInternalNumber();
      break;
    case "B":
      member_B = x.getInternalNumber();
      break;
    case "C":
      member_C = x.getInternalNumber();
      break;
    case "D":
      member_D = x.getInternalNumber();
      break;
    default:
    }
 }


 xyz(x, "A");
 ...
 xyz(x, "B");
 ...
 etc
  

switch Должно быть заменено более элегантным решением. Технически, вызовы xyz(…) должны обновлять правильное поле некоторым значением.
У кого-нибудь есть идея улучшить это?

Комментарии:

1. Как насчет сохранения member_X s в Map<String, String> ?

2. да, пробовал, но действительно ли элемент string можно изменить?

3. Просто вызовите put , чтобы изменить значение. В чем проблема?

4. Почему бы просто не вызвать member_A = x.getInternalNumber(); (etc) напрямую?

5. Спасибо! Map .put() приводит меня к правильному решению.

Ответ №1:

Если ваши соглашения об именовании переменных-членов соответствуют приведенным в вашем примере кода, вы можете использовать отражение. Если это более элегантно, чем то, что у вас есть прямо сейчас, это спорно.

 private void xyz(Object x, String s) {
    try {
        Field member = YourClass.class.getDeclaredField("member_" s); //replace YourClass with your class name
        member.setAccessible(true);
        member.set(this, x.getInternalNumber());
    } catch (IllegalArgumentException | IllegalAccessException | NoSuchFieldException | SecurityException ex) {

    }
}
  

Ответ №2:

Вы могли бы создать class элемент. Может быть, что-то вроде этого:

 class Member {

    String string;
    char member;

    Member (char member) {
        this.string = null;
        this.member = member;
    }
}
  

Затем создайте array из элементов, затем протестируйте каждый из них в foreach цикле, вот так:

 private void test(char s) {
    for (Member m : members) {
        if (m.member == s) {
            m.string = "Whatever you want that member string to be equal to";
        }
    }
}