2016-01-12 2 views
3

У меня есть ситуации, где у меня есть список (необходимые элементы), который содержит столбец таблицы результата, как:Найти индекс объекта в списке

NAME 
ADDRESS 
AGE 
. 
. 
etc 

В моем методе я получаю объект пользователя, который содержит значение для user.getName(), user.getAge() etc. Я хочу знать, как наилучшим образом гарантировать, что каждый элемент в списке присутствует в объекте пользователя. Нет элементов в списке переменных.

public boolean isUserInfoComplete(User user, ArrayList list){ 
    //so, if the list has AGE, the user.getAge() must have some value 
} 

Один из способов я думал поддерживает еще один список, который содержит значения каждой информации пользователя и проверки того, что против моего списка БД, но это не является масштабируемым.

ответ

1

Вы можете использовать отражение, чтобы решить эту проблему, если элементы в списке соответствуют геттерам в объекте пользователя.

Например, если AGE находится в списке, вы можете использовать отражение для поиска метода getAge() класса User, вызвать его на объекте и затем проверить результат для null (или включить метод тип возврата для выполнения других типов проверок).

Вот отправная точка для вас, чтобы экспериментировать с (я не компилируется или тестировал):

public boolean isUserInfoComplete(User user, ArrayList list){ 
    for(String attribute : list) { 
     String methodName = "get" + attribute.substring(0, 1).toUpperCase() + attribute.substring(1).toLowerCase(); 
     Method method = User.class.getMethod(methodName, null); 
     if(method != null) { 
      Object result = method.invoke(user); 
      if(result == null) { 
       return false; 
      } 
     } 
    } 
    return true; 
} 
+0

Duh! Почему он не щелкнул мне в голову. Большое спасибо. –

0

Вы можете проверить его с помощью contains() во время цикла. Этот процесс будет очень ресурсоемким. Возможно, вы можете что-то переделать и просто сравнить два объекта User? Будет быстрее. Вы можете сделать это, предоставив собственную реализацию методов equals и hashcode.

1

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

Если вы знаете, что ваши Пользовательские объекты и т. Д. Будут следовать стандарту java bean, тогда вы сможете использовать геттеры для проверки, хотя теперь я вижу проблему при создании полей public final и проверку непосредственно на самих полях.

Посмотрите на https://docs.oracle.com/javase/tutorial/reflect/

2

Это не возможно динамически сопоставлять ваши имена методов с содержимым списка без отражения (которые могут быть дорогими и хрупкими). Возможно, вы захотите сохранить свои значения User в центральном кэше Map. Вот один из способов сделать это:

public class User { 

    private enum Field { 
     NAME, 
     AGE 
     //... 
    } 

    private Map<String, Object> values = new HashMap<>(); 

    private void putValue(Field field, Object value) { 
     values.put(field.name(), value); 
    } 

    private Object getValue(Field field) { 
     return values.get(field.name()); 
    } 

    public void setName(String name) { 
     putValue(Field.NAME, name); 
    } 

    public String getName() { 
     return (String)getValue(Field.NAME); 
    } 

    public void setAge(int age) { 
     putValue(Field.AGE, age); 
    } 

    public Integer getAge() { 
     return (Integer)getValue(Field.AGE); 
    } 

    //... 

    public boolean isUserInfoComplete(List<String> fields) { 
     return values.keySet().containsAll(fields); 
    } 
} 
+0

На самом деле, мне нравится этот подход лучше справляться с любой хрупкостью. –

Смежные вопросы