Java多对象库存增减方法的高效实现优化问询
优化Java库存类的参数冗余问题
问题背景
我是Java新手,目前实现了一个库存Inventory类,包含AddToInventory和RemoveFromInventory方法,通过传入多个布尔参数控制食物、饮品、玩具、露营用品等物品的增删。Items.java负责创建物品对象,Objects.java仅返回对象名称用于打印,现有代码能正常运行。但随着物品数量增加,调用这些方法时需要传入大量布尔参数(示例:调用AddToInventory时要逐个指定各物品的增删布尔值),代码冗余繁琐。我曾考虑为每个物品单独实现增删方法,但觉得和现有方案差异不大,希望找到更高效的方式实现多对象的库存增删,解决参数冗余问题。
现有核心代码:
public class Inventory { String name; Items myItems = new Items(); boolean addFoodItem; boolean addDrinkItem; boolean addToyItem; boolean addCampingItem; boolean removeFoodItem; boolean removeDrinkItem; boolean removeToyItem; boolean removeCampingItem; ArrayList<Objects> inventory = new ArrayList<Objects>(); Objects myObjects = new Objects(name); public boolean AddToInventory (boolean addFoodItem, boolean addDrinkItem, boolean addToyItem, boolean addCampingItem) { if (addFoodItem) { inventory.add(myItems.foodItem); System.out.println("You have added 1 " + myItems.FoodItem.name + " to your inventory."); } if (addDrinkItem) { inventory.add(myItems.drinkItem); System.out.println("You have added 1 " + myItems.DrinkItem.name + " to your inventory."); } if (addToyItem) { inventory.add(myItems.toyItem); System.out.println("You have added 1 " + myItems.ToyItem.name + " to your inventory."); } if (addCampingItem) { inventory.add(myItems.campingItem); System.out.println("You have added 1 " + myItems.CampingItem.name + " to your inventory."); } return true; } public boolean RemoveFromInventory(boolean removeFoodItem, boolean removeDrinkItem, boolean removeToyItem, boolean removeCampingItem) { if (removeFoodItem) { inventory.remove(myItems.foodItem); System.out.println("You have used 1 " + myItems.foodItem.name + " from your inventory."); } if (removeDrinkItem) { inventory.remove(myItems.drinkItem); System.out.println("You have used 1 " + myItems.drinkItem.name + " from your inventory."); } if (removeToyItem) { inventory.remove(myItems.toyItem); System.out.println("You have used 1 " + myItems.toyItem.name + " from your inventory."); } if (removeCampingItem) { inventory.remove(myItems.campingItem); System.out.println("You have used 1 " + myItems.campingItem.name + " from your inventory."); } return true; } public void GetInventory() { for (Objects items : inventory) { System.out.println(items.name); } } }
调用示例:
if (//add check here) { Inventory.AddToInventory (true, false, false, false); }
优化方案
方案1:直接传入物品对象(最直观高效)
修改增删方法,让它们接收可变参数的物品对象,想操作什么物品就传什么,无需管其他物品,彻底解决参数冗余问题。
优化后的代码:
public class Inventory { // 用private封装成员变量,符合Java规范 private Items myItems = new Items(); private ArrayList<Objects> inventory = new ArrayList<>(); // 单个物品添加逻辑,复用性强 private void addSingleItem(Objects item) { inventory.add(item); System.out.println("You have added 1 " + item.name + " to your inventory."); } // 批量添加,支持任意数量的物品参数 public boolean addToInventory(Objects... items) { for (Objects item : items) { addSingleItem(item); } return true; } // 单个物品移除逻辑,先判断是否存在再操作 private void removeSingleItem(Objects item) { if (inventory.remove(item)) { System.out.println("You have used 1 " + item.name + " from your inventory."); } else { System.out.println(item.name + " is not in your inventory."); } } // 批量移除,支持任意数量的物品参数 public boolean removeFromInventory(Objects... items) { for (Objects item : items) { removeSingleItem(item); } return true; } public void getInventory() { for (Objects item : inventory) { System.out.println(item.name); } } }
调用示例:
// 只添加食物 inventory.addToInventory(myItems.foodItem); // 同时添加食物和露营用品 inventory.addToInventory(myItems.foodItem, myItems.campingItem); // 移除饮品和玩具 inventory.removeFromInventory(myItems.drinkItem, myItems.toyItem);
方案2:用枚举标记物品类型
如果不想直接传递物品对象,可以先定义物品类型枚举,通过枚举参数指定要操作的物品,适合需要按类型统一管理的场景。
首先定义枚举类:
public enum ItemType { FOOD, DRINK, TOY, CAMPING }
然后修改Inventory类:
public class Inventory { private Items myItems = new Items(); private ArrayList<Objects> inventory = new ArrayList<>(); public boolean addToInventory(ItemType... types) { for (ItemType type : types) { Objects item = switch(type) { case FOOD -> myItems.foodItem; case DRINK -> myItems.drinkItem; case TOY -> myItems.toyItem; case CAMPING -> myItems.campingItem; }; inventory.add(item); System.out.println("You have added 1 " + item.name + " to your inventory."); } return true; } public boolean removeFromInventory(ItemType... types) { for (ItemType type : types) { Objects item = switch(type) { case FOOD -> myItems.foodItem; case DRINK -> myItems.drinkItem; case TOY -> myItems.toyItem; case CAMPING -> myItems.campingItem; }; if (inventory.remove(item)) { System.out.println("You have used 1 " + item.name + " from your inventory."); } else { System.out.println(item.name + " is not in your inventory."); } } return true; } public void getInventory() { for (Objects item : inventory) { System.out.println(item.name); } } }
调用示例:
// 添加食物和玩具 inventory.addToInventory(ItemType.FOOD, ItemType.TOY); // 移除露营用品 inventory.removeFromInventory(ItemType.CAMPING);
额外规范建议
- 遵循Java驼峰命名法:方法名用小驼峰(比如
addToInventory而非AddToInventory),成员变量统一小写开头,避免大小写混乱(比如原代码中myItems.FoodItem和myItems.foodItem混用的问题)。 - 成员变量尽量用
private修饰,通过方法访问,保证封装性。 - 移除操作时先判断物品是否存在,避免输出错误提示。
内容的提问来源于stack exchange,提问作者NobleRuckus
相关产品推荐
相关产品推荐

