将内存分配给一些方法使用的变量的最佳位置在哪里?

时间:2013-11-27 03:15:39

标签: java list memory-management arraylist lazy-initialization

我有一个类如下,用于从数据库中检索所有用户和所有在线用户,检索后将结果放入“用户”变量以供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
}

2 个答案:

答案 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则定义它。虽然,这不是这里的情况,但是为了将来提到它 - 在这些延迟初始化的情况下,如果你在多线程环境中运行并且你的方法是静态的,你需要格外小心。它可能会造成竞争条件。它有很多,但没有讨论,因为它将远远超出所提问题的复杂性。