为什么向ArrayList添加新对象后,列表内容未反映对应更新?
问题原因
你当前编写的getDishes()方法逻辑存在问题:每次调用该方法时,都会初始化一个全新的ArrayList对象,填充默认菜品后直接返回。你在代码中两次调用Dish.getDishes()拿到的是两个完全独立的列表对象:第一次调用时在新生成的临时列表里添加了菜品,这个临时列表没有被持久化存储,调用结束就被销毁了;第二次调用getDishes()时又生成了一个只包含默认菜品的新列表,所以打印结果看不到新增的内容。
修复方案
你需要将菜单列表作为Dish类的静态成员变量持久化保存,不要每次调用方法都重新创建列表,修改后的Dish类代码参考如下:
public class Dish { // 新增静态成员变量,全局保存菜单列表 private static List<Dish> myMenu; // 静态代码块,类加载时仅执行一次,初始化默认菜品 static { myMenu = new ArrayList<>(); myMenu.add(new Dish("Fried Rice", "Rice, Sesame Oil", 10, true, true)); myMenu.add(new Dish("Sushi Roll", "Rice, Seaweed, Salmon", 5, false, false)); myMenu.add(new Dish("Pancake", " Egg, Flour, Vanilla Essence", 8, true, false)); myMenu.add(new Dish("Omelette", " Egg, Tomato, Mushroom, Onion", 8, false, true)); } public static List<Dish> getDishes() { // 直接返回已有的静态列表,不再新建对象 return myMenu; } // 此处保留你原有Dish类的构造方法、其他成员方法逻辑不变 }
修改完成后所有位置调用getDishes()拿到的都是同一个列表对象,新增的菜品会一直保存在列表中,打印就能看到新增内容了。
可选优化
如果要避免外部随意修改列表结构,可以单独封装新增菜品的方法,同时getDishes()返回只读视图,规范操作入口:
// 新增专门的添加菜品静态方法 public static void addDish(Dish dish) { myMenu.add(dish); } // getDishes返回不可修改的列表视图,防止外部误操作修改列表 public static List<Dish> getDishes() { return Collections.unmodifiableList(myMenu); }
优化后Controller中的添加逻辑改成调用Dish.addDish(新菜品对象)即可。
内容的提问来源于stack exchange,提问作者Shiv
相关产品推荐
相关产品推荐

