#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";
}
}
}