我正在制作一个节目。我将用户存储在ArrayList中,因此我有一个UserCollection类,它充当了用户的存储类。但是看到UserCollection被认为是一个数据库'数据库中的每个用户条目都应具有唯一的ID。最初我有一个userID作为User类中的一个字段,但现在我试图处理UserCollection中的id部分。如果我要使用一个hashmap,其中key是id,那么值是User,我将如何继续迭代id,这样每次将一个新用户存储到hashmap中时,它们的密钥都会从1到n用户数量。我还使用CRUD方法存储/删除/更新用户等。
public class UserCollection{
Map<Integer, User> userMap = new HashMap<Integer,User>();
public User create(User user){
userMap.put(??,user) // not sure how to iterate the id or what to put in it
return user;
}
public User read(Integer keyID){
if(userMap.containsKey(keyID)){
return userMap.get(keyID); //something definitely wrong
}
}
//Other remaining CRUD methods after.
}
最初我只有一个持有用户的ArrayList。但是因为我在数据库中意识到用户将拥有独特的身份,现在我很困惑我将如何处理它们。如果我在HashMap中处理它们,我还需要在User类中有一个userID字段吗?
答案 0 :(得分:1)
你在这里问了几个问题。我将轮流接受每一个:
最简单的方法是使用一个静态字段来跟踪最大的生成ID:
class User {
private static int largestID = 0;
private final int id = largestID++;
public int getID() {
return id;
}
...
}
这有效,但有很多问题。只要您存储用户&amp;重启程序,或者想重用id,它需要改变。
另一种方法是从您的收藏中找到现有客户的最大ID。以下示例代码使用Java 8:
class UserCollection {
private final Map<Integer,User> users = new HashMap<>();
public int nextID() {
return users.keySet().stream()
.mapToInt(n -> n).max().orElse(-1) + 1;
}
}
这样效率很低,但对于很多应用来说可能还不错。
您有两种选择。您可以将其存储在类中,并提供获取ID的机制(如上所述)。或者,您确保处理用户的所有内容都存储并返回ID,而不是对象的引用。这允许该方法的客户端然后使用该ID访问用户。
这两者都是合法的解决方案。如果您使用第一个(在类中存储ID),那么您应该更改将用户添加到集合中的方法:
class UserCollection {
public void addUser(User user) {
users.put(user.getID(), user);
}
}
如果你使用第二个,那么ID字段必须是最终的,因为客户依赖它不会改变。
答案 1 :(得分:0)
您可以执行以下操作以确保您的用户在班级生命周期中拥有唯一ID。
public class UserCollection
{
private static int id = 0;
private static final Object lock = new Object();
private Map<Integer, User> userMap = new HashMap<Integer,User>();
public User create (User user)
{
// only add one user at a time to the map
synchronized (lock)
{
id++;
userMap.put(id, user);
}
return user;
}
// Rest of the class
}