我有一种情况,我有一个列表(必需的项目),其中包含表格列结果,如:
NAME
ADDRESS
AGE
.
.
etc
在我的方法中,我得到一个包含user.getName(), user.getAge() etc.
值的User对象。我想知道确保列表中的每个项都出现在用户对象中的最佳方法。列表中的项目数是可变的。
public boolean isUserInfoComplete(User user, ArrayList list){
//so, if the list has AGE, the user.getAge() must have some value
}
我想到的一种方法是维护另一个列表,该列表包含每个用户信息的值,并根据我的数据库列表进行检查但是不可扩展。
答案 0 :(得分: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);
}
}
答案 1 :(得分:1)
如果列表中的项目与User对象中的getter匹配,则可以使用反射来解决此问题。
例如,如果AGE在列表中,您可以使用反射在User
类上查找getAge()方法,在对象上调用它,然后检查结果为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;
}
答案 2 :(得分:1)
这似乎是需要反思的情况。这使您有机会在运行时检查对象中的方法和字段。
如果您知道您的用户对象等将遵循java bean标准,那么您将能够使用getter进行检查,但我现在看到在创建字段public final
时出现问题并直接检查字段本身。
答案 3 :(得分:0)
您可以在循环时使用contains()
进行检查。这个过程非常耗费资源。
也许你可以重新设计一些东西并简单地比较两个User对象?会更快。您可以通过提供自己的equals
和hashcode
方法实现来实现。