You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 21:01:40