首页 > 解决方案 > ArrayList 允许我将项目存储到其中但不使用 .get() 调用它们,说它不是 ArrayList

问题描述

我正在编写一个程序来使用命令设计模式模拟餐厅菜单系统。我让我的菜单类中的构造函数初始化了一个数组列表。

import java.util.ArrayList;

public class Menu {

    public ArrayList<MenuItem> listOfMenuItems;

    public Menu() {
        listOfMenuItems = new ArrayList<MenuItem>();
    }

    public void addItemToMenu(String itemName, String itemDescription, double cost) {
        MenuItem newMenuItem = new MenuItem(itemName, itemDescription, cost);
        listOfMenuItems.add(newMenuItem);
    }

    public void displayMenu() {
        for(MenuItem item : listOfMenuItems) {
            System.out.println("NAME: " + item.getItemName() + ", DESCRIPTION: " + item.getItemDescription()
                + ", COST: " + item.getItemCost());
        }
    }
}

在我的客户端中调用新菜单时,它允许我存储项目(就像它是一个数组列表一样),它还允许我实现命令设计模式并将我的所有项目打印出来。但是,我添加了一个 Tab 类,它使用来自我的 Menu 对象的信息,但它不允许我使用 .get() 从我的数组列表中检索信息。

import java.util.*;

public class testClient {
    public static void main(String[] args) {

        Menu menu = new Menu();
        Tab tab;

        System.out.println("MENU:");

        menu.addItemToMenu("lobster", "#1234" , 25.99);
        menu.addItemToMenu("chicken", "#5687" , 20.99);
        menu.addItemToMenu("steak", "#4567" , 21.99);

        DisplayMenu dispMenu = new DisplayMenu(menu);
        SubmitButton onPressed = new SubmitButton(dispMenu);
        onPressed.submit();

        System.out.print("\n");

        System.out.println("ORDERS:");

        Order order = new Order();
        order.addNewOrder("#1234");
        order.addNewOrder("#5678");

        SubmitOrder submitOrder = new SubmitOrder(order);
        SubmitButton onSubmitPressed = new SubmitButton(submitOrder);
        onSubmitPressed.submit();

        tab.constructTab(newMenu.get(0).getItemName(), order.get(0).getOrderItemNumber(), newMenu.get(0).getItemCost());

    }
}

tab.constructTab(....) 行返回以下错误:

testClient.java:31: error: cannot find symbol
        tab.constructTab(menu.get(0).getItemName(), order.get(0).getOrderItemNumber(), menu.get(0).getItemCost());
                             ^
  symbol:   method get(int)
  location: variable menu of type Menu
testClient.java:31: error: cannot find symbol
        tab.constructTab(menu.get(0).getItemName(), order.get(0).getOrderItemNumber(), menu.get(0).getItemCost());
                                                         ^
  symbol:   method get(int)
  location: variable order of type Order
testClient.java:31: error: cannot find symbol
        tab.constructTab(menu.get(0).getItemName(), order.get(0).getOrderItemNumber(), menu.get(0).getItemCost());
                                                                                           ^
  symbol:   method get(int)
  location: variable menu of type Menu
3 errors

它说菜单应该是数组列表时是菜单类型?我不明白为什么它允许我添加项目。

如果您需要任何其他代码,请告诉我。

先感谢您!

标签: javaobjectarraylist

解决方案


首先,您应该设置listOfMenuItems为私有,因此您只能通过 getter 和 setter 访问它。这样您就可以阻止其他类直接访问该字段,因为您可能希望在为其分配任何值之前添加进一步的控件和/或条件。然后,您应该添加一个获取方法字段,listMenuItem就像您使用addItemToMenu(). 这段代码将如下所示:

import java.util.ArrayList;

    public class Menu {

        private ArrayList<MenuItem> listOfMenuItems;

        public ArrayList<MenuItem> getListOfMenuItems(){
              return this.listOfMenuItems;
        }
    }

要在你的主函数中调用它,你可以这样做,

public class testClient {
    public static void main(String[] args) {
        Menu menu = new Menu();
        Tab tab;
        tab.constructTab(menu.getListOfMenuItems().get(0).getItemName(), order.getListOfMenuItems().get(0).getOrderItemNumber(), menu.getListOfMenuItems().get(0).getItemCost());
        }
}

请注意,返回类型getListOfMenuItems()是 an ArrayList,使您只能在调用 后使用其所有预定义函数getListOfMenuItems()


推荐阅读