嘿伙计我刚才有一个关于初始化arraylist的快速问题
这只是我正在做的一小段代码
public class OrderManager {
ArrayList<Order>orders = new ArrayList<Order>();
public OrderManager() {
}
public OrderManager(ArrayList<Order> orders) {
orders = new ArrayList<Order>();
}
使用变量订单,然后声明orders = new
正确吗?或者这是两个不同的实例,当我尝试添加它的东西时它不会起作用?
或者,因为OrderManager将采用arraylist甚至是否有意义?
我还没有测试过,我刚刚开始编写这段代码并且在我无法正确添加到列表之前遇到了这个问题并且认为这是因为类似于这样的错误只是检查尝试和从正确开始吧。
答案 0 :(得分: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
并且例如ArrayList
,则还可以考虑使用ArrayList
而不是LinkedList
因为您不必修改此类。编程到接口概念。
所以你的课程看起来像是:
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);
}
}
答案 1 :(得分:2)
您目前正在做的是分配一个new
,空ArrayList
而不是指定给定的。{/ p>
你应该这样做:
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
。
答案 2 :(得分:0)
你的第二个构造函数是错误的。
应该是:
public OrderManager(ArrayList<Order> orders) {
this.orders = orders;
}
构造函数是用于创建新对象并初始化其类变量的内容。
使用new
时,您正在调用类构造函数。
有时可以从另一个构造函数调用一个构造函数。当调用构造函数初始化一组更大的变量并使用其他构造函数初始化子集(因此不重复相同的代码)时,就完成了。在这种情况下,您可以使用this
并使用正确的签名。