Java类的良好编码实践

时间:2014-02-25 06:25:11

标签: java

我有一个类似下面的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)由于很多成熟/经验丰富的开发人员访问这个网站,在获得更多的问题的建议/反馈/答案有什么不对   实践经验基础?暂停这个问题完全违背了目的

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)

  1. 你想要做的只是通过id找到一个用户,我认为以下代码更好:
  2. for(UserInfo user: users){
        if(user.getId().equals(id)){
            return user;
        }
    }
    
    1. 我会显式初始化变量因为它有意义,使用默认的内置机制会让其他人在阅读你的代码时感到困惑。