1

嘿伙计们,我有一个关于初始化数组列表的快速问题

这只是我正在做的一小段代码

public class OrderManager {
    ArrayList<Order>orders = new ArrayList<Order>();
    public OrderManager() {

    }

    public OrderManager(ArrayList<Order> orders) {
        orders = new ArrayList<Order>();
    }

使用变量命令,然后声明orders = new正确?还是这将是两个不同的实例,当我尝试向其中添加内容时它不起作用?

或者由于 OrderManager 将采用 arraylist 是否有意义?

我还没有测试过,我刚开始写这段代码,在我无法正确添加到列表之前遇到了这个问题,我认为这是因为类似于这个的错误,只是检查并尝试让它正确开始。

4

3 回答 3

3
public class OrderManager {
    private ArrayList<Order>orders;
    public OrderManager() {
      this(new ArrayList<>());//call constructor
    }

    public OrderManager(ArrayList<Order> orders) {
        this.orders = orders;
    }
  .
  .
   //more methods here for example getters and/or setters for orders
}

这是正确的方法。如果您不想这样做,也可以考虑在将来使用List而不是导致,例如,您不必修改此类。对接口概念进行编程。ArrayListArrayListLinkedList

所以你的班级看起来像:

    public class OrderManager {
        private final List<Order>orders;

        public OrderManager() {
          this(new ArrayList<>());//call constructor or doing nothing is another option
        }

        public OrderManager(List<Order> orders) {
            this.orders = orders;
        }


       public List<Order> getOrders(){
           return orders;
       }    

       public void addOrder(Order order){
            orders.add(order);
       }
  }
于 2013-09-18T18:42:01.053 回答
2

您目前正在做的是分配一个new, 空ArrayList而不是给定一个。

你应该这样做:

public class OrderManager {
    private final List<Order> orders;

    public OrderManager() {
        orders = new ArrayList<Order>();
    }

    public OrderManager(final List<Order> orders) {
        this.orders = orders;
    }

它将引用List传递给构造函数的引用。List来自班级外部的更改将影响List班级内部。

更常见的方法是使用复制构造函数制作“防御性副本”

public class OrderManager {
    private final List<Order>orders;

    public OrderManager() {
        orders = new ArrayList<Order>();
    }

    public OrderManager(final List<Order> orders) {
        this.orders = new ArrayList<Order>(orders);
    }

现在该类有一个List传入的副本,因此它将独立于原始的List

于 2013-09-18T18:45:09.750 回答
0

您的第二个构造函数是错误的。

它应该是:

public OrderManager(ArrayList<Order> orders) {
        this.orders = orders;
    }

构造函数用于创建新对象并初始化其类变量。

当您使用时,new您正在调用类构造函数。

在某些情况下,可以从另一个构造函数调用一个构造函数。当调用构造函数初始化更大的变量集并使用其他构造函数初始化子集时完成(因此不要重复相同的代码)。在这种情况下,您可以使用this适当的签名。

于 2013-09-18T18:43:33.090 回答