非static场景下Getter获取ArrayList无返回值的问题排查与解决
购物车数据无法打印的问题及解决
问题背景
有两个类:ShoppingCart类包含一个private修饰的ArrayList用于存储购物车商品,CartGUI类负责打印购物车中的商品。通过Getter方法在CartGUI中获取商品列表并打印时,没有输出任何内容。测试确认原本的ArrayList并非空集合,将其设为static后代码可以正常运行,但不符合需求。
现有代码示例
CartGUI.java
public void printCart() { ShoppingCart shoppingCart = new ShoppingCart(); System.out.println("Products in cart: "); for (Product p : shoppingCart.getCart()) { System.out.println(p.getProductName()); } }
ShoppingCart.java
private ArrayList<Product> cart = new ArrayList<>(); public ArrayList<Product> getCart() { return cart; }
问题原因
在printCart方法中新建了一个ShoppingCart实例,这个新实例的cart集合是空的,和原本存储了商品的ShoppingCart实例不是同一个对象,因此遍历不到任何数据。
解决方法
最终通过单例模式确保全局只有一个ShoppingCart实例,并将这个唯一实例传入CartGUI类中使用,解决了问题。
示例修改如下:
- 将
ShoppingCart改为单例实现:
public class ShoppingCart { private static ShoppingCart instance; private ArrayList<Product> cart = new ArrayList<>(); private ShoppingCart() {} public static ShoppingCart getInstance() { if (instance == null) { instance = new ShoppingCart(); } return instance; } public ArrayList<Product> getCart() { return cart; } }
- 在
CartGUI中使用该单例实例,而非新建对象:
public void printCart() { ShoppingCart shoppingCart = ShoppingCart.getInstance(); System.out.println("Products in cart: "); for (Product p : shoppingCart.getCart()) { System.out.println(p.getProductName()); } }
也可以通过构造方法将单例实例传入CartGUI,核心是确保CartGUI使用的是存储了商品的那个ShoppingCart实例。
内容的提问来源于stack exchange,提问作者Jr.Macking
相关产品推荐
相关产品推荐

