我有一个类如下,用于从数据库中检索所有用户和所有在线用户,检索后将结果放入“用户”变量以供jsp使用。
我想知道我应该在哪一行使用List users = new ArrayList?消耗更少的内存并提高效率?请注意,只有两种方法可以使用它。
*我知道如果我不在构造函数中创建它,我需要在将要使用它的所有方法中创建它,但是因为只有两个方法正在使用它,在构造函数中创建它是否有意义?请给我你的理由,我想学习。
public class Groups {
private List<User> users;
public Groups(){
//Line 1 users = new ArrayList<User>;
//Line 2 if (users == null) {
// users = new ArrayList<User>();
// }
}
public retrieveAllGrades(){
...
}
public retrieveAllUsers(){
//Line 3 users = new ArrayList<User>;
this method uses it to keep the results of all users retrieved from database
}
public retrieveOnlineUsers(){
//Line 4 users = new ArrayList<User>;
this method uses it to keep the results of all online users retrieved from database
}
all getters and setters
}
答案 0 :(得分:1)
通常,您希望在构造函数中分配内存,以便方法可以共享它,即使它只是其中的两个
如果您对内存有所了解,可以使用lazy
分配,只在需要时分配。因此,您可以将用户作为null
开始,但在构造函数中将其声明为null
然后,如果调用任一方法,您可以检查它是否为null
然后分配(调用new)。请记住,这会导致多线程代码中出现更多复杂问题,并且每次调用任一方法都会花费一些cpu,因为您必须检查null
延迟分配示例:
public Groups(){
users = null;
}
public retrieveAllUsers(){
if (users == null) users = new ArrayList<User>;
// this method uses it to keep the results of all users retrieved from database
}
public retrieveOnlineUsers(){
if (users == null) users = new ArrayList<User>;
// this method uses it to keep the results of all online users retrieved from database
}
答案 1 :(得分:1)
构造函数是您应该这样做的地方。
将它放在其他任何地方可能对你来说看起来很有效,但是它会在设计上有很大的权衡。假设你在retrieveOnlineUsers()中分配内存,但是你如何保证“用户”的操作顺序。如果首先调用retrieveAllUsers()而不分配内存并执行某些任务,那么您将陷入NPE。在撰写本文时,您可能会保证始终首先调用retrieveOnlineUsers(),但在将来,查看您的代码的其他人将永远不会知道不应首先调用retrieveAllUsers()。
构造函数保证在它之前不会调用其他方法,因此每个函数都将具有“用户”的具体定义。
但是,如果您决定不在构造函数中初始化它,那么对要访问“users”的方法保持空值检查,如果它为NULL则定义它。虽然,这不是这里的情况,但是为了将来提到它 - 在这些延迟初始化的情况下,如果你在多线程环境中运行并且你的方法是静态的,你需要格外小心。它可能会造成竞争条件。它有很多,但没有讨论,因为它将远远超出所提问题的复杂性。