我有一个类似下面的POJO课程:
public class UserInfo {
private Integer userId;
private String userName;
private boolean select;
private boolean active;
public UserInfo(){
}
public UserInfo(Integer userId) {
super();
this.userId = userId;
}
@Override
public boolean equals(Object obj) {
//use userId property
}
@Override
public int hashCode() {
//use userId property
}
}
如果我想搜索给定的UserInfo对象,在用户列表中,我使用下面的代码:
List<UserInfo> users = new ArrayList<UserInfo>();
//users are populated by some means
Integer userId = //got externally by a method call
int index = users.indexOf(new UserInfo(userId));
if(index != -1){
//get user form list
UserInfo user = users.get(index);
// do processing
}
我的问题是:
1)使用只有一个字段(在indexOf方法中使用)的构造函数来搜索给定用户,这是一个很好的编码实践吗?使用这个的原因 构造函数是因为我的hashcode和eqauls只检查userId,只创建了包含对象的信息。
2)在我的代码中,我在很多地方进行布尔比较,如下所示:
if(user.isSelect){
//user is selcted , do some operation
}
只有在代码中的其他位置满足某个条件时才会将选择值指定为true,否则它始终为false。
由于实例变量在创建对象时自动初始化为默认值(因此boolean为false), 在创建对象时,我还需要将布尔变量明确地初始化为false吗? (从良好的编码实践的角度来看)还是可以依赖默认的内置机制?
编辑1: 作为对这个问题的回应被搁置
我同意这个问题的答案可能存在分歧。 但是,我向所有那些暂停这个问题的人提出了问题(特别是在这个问题的背景下):
1)这不是一个你会在任何书中得到答案的问题。很多开发人员很可能遇到过这种情况 2)开发人员总是看着他/她的高级开发人员向他/她学习,因为这些人从经验中学到了通常不会 在任何一本书中找到。 3)由于很多成熟/经验丰富的开发人员访问这个网站,在获得更多的问题的建议/反馈/答案有什么不对 实践经验基础?暂停这个问题完全违背了目的
答案 0 :(得分:3)
1)似乎您想通过指定的userId在UserInfo
中搜索用户。根据您的方案,强烈建议您使用HashMap
作为UserInfo
容器。示例代码:
List<UserInfo> users = ...;// given a list of UserInfo
//put UserInfo into a HashMap
Map<Integer, UserInfo> userMap = new HashSet<Integer, UserInfo>();
for(UserInfo user : users) {
userMap.put(user.getId(), user);
}
int uid = ...;//given a uid
//lookup the user in HashMap by uid
UserInfo user = userMap.get(uid);
如果您只需要使用ArrayList。以下代码效果更好:
List<UserInfo> users = ...;// given a list of UserInfo
long uid = ...;//given a uid
for(UserInfo user : users) {
if(user.getId() == uid) {
//target user found
}
}
这可以避免每次要搜索目标用户时创建对象:users.indexOf(new UserInfo(userId))
2)如果boolean
字段的默认值为false
,则无需启动boolean
字段。但是,如果true
字段的默认值为absent
,我们该怎么办?我会告诉你一点技巧,这是一个相反的词。例如,您需要一个字段来描述用户是否缺席会议,如果您希望用户默认不在,则选择单词present
作为您的字段名称。否则,如果您希望用户默认不在,请选择单词{{1}}。
答案 1 :(得分:0)
indexOf方法用于从集合中搜索。由于同样的原因,java提供了方法,所以可以使用indexOf方法进行搜索。 虽然您可能需要对重复元素保持谨慎。 indexOf方法给出列表中第一次出现的元素,因此如果列表包含重复元素,则可能需要根据业务需要进行过度操作。
此外,如果您的集合没有重复元素而不是使用Set,因为它们不支持重复元素,并且是用于避免重复元素的正确集合形式。
答案 2 :(得分:0)
for(UserInfo user: users){ if(user.getId().equals(id)){ return user; } }