有没有更有效的方法从具有多个对象的方法返回布尔值?

Is there a more efficient way of returning a boolean from a method with multiple objects?

提问人:NobleRuckus 提问时间:12/5/2022 最后编辑:NobleRuckus 更新时间:12/8/2022 访问量:82

问:

请原谅我对这个问题的措辞,我对 Java 还很陌生,所以我不确定如何措辞。基本上,我已经创建了一个清单并添加了 2 种不同的方法:

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);
        }    
    }

将有更多对象将被添加到此脚本中,这就是为什么我正在寻找一种可能更有效的方法。Items.java类只是创建对象,而 Objects.java类只返回对象的名称,以便可以打印它。所有这些代码都有效,但是当我添加更多项时,我需要不断将其他类中的布尔值切换为 true 和 false,以便运行 AddToInventory 和 RemoveFromInventory 方法。

所以我的问题是,检查是否需要在清单中添加和/或删除多个对象的更有效方法是什么 (ArrayList)。我考虑过对每个单独的检查使用一种方法(用于增加或减少库存),但排除了它,因为它与我上面的方法没有太大区别。 谢谢大家!

我的想法是,如果我从另一个类调用此方法并将布尔值切换为 true,这些方法将执行 if 语句中的代码,并将在“库存”ArrayList 中添加或删除。我看到的低效率是,当从另一个类调用此方法时,我必须在参数中包含所有布尔值,例如:

if (//add check here)
{
    Inventory.AddToInventory (boolean addFoodItem = true, boolean 
    addDrinkItem = false, boolean addToyItem = false, boolean addCampingItem 
    = false)
}

随着更多项目的添加,这是相当大的文本块。如果可能的话,这就是我想清理的东西。

Java ArrayList 方法 boolean

评论

0赞 Scary Wombat 12/5/2022
如果只返回,那么这样做就没有意义了。也看不到什么是低效的。return true;
2赞 racraman 12/5/2022
尝试使用单个 ,并具有子类 、 等。这样,只需添加到列表中 - 无需再更改代码,因为您添加了新类型的项。abstract class ItemCampingItemToyItemaddToInventiory
0赞 TylerH 12/5/2022
这是带有单选按钮的表单,还是带有复选框的表单?你也许可以做这样的事情foreach option O in List L { if (checked/selected) { <add item to inventory> } }

答:

0赞 Octavia 12/5/2022 #1

如果我是你,我会做一个代表每个项目的枚举,并在操作完成后(添加/删除),返回该枚举。这样,您将知道对哪种项目执行了操作。

此外,在您当前的代码中,与其使用多个 if,不如使用开关大小写。

0赞 NobleRuckus 12/8/2022 #2

我使用了@racraman建议,并为所有项目创建了一个包含子类的超类,因此方法中没有如此长的项目布尔值参数。从那时起,我添加了 10 个新对象,因此该列表每次都重复会很长而且很丑陋!