访问私有数组中对象的私有变量

时间:2018-03-10 06:40:43

标签: java arrays private private-members

我想创建一个可以有多个菜单的Restaurant对象。每个菜单可以有多个类别,每个类别可以有多个项目。每个项目都有名称,价格和描述。

--Company--
  -Menu ONE-
  -Menu Name-
    -Category ONE-
       -Category Name-
       -Menu Item ONE-
         -Menu Item Name
         -Menu Item Price
         -Menu Item Description
       -Menu Item TWO-
    -Category TWO-
  -Menu TWO- 

没有构造函数,getter / setter或方法的示例类。

拥有一系列菜单的公司

    public class Company
    {   
        // Class constants

        // Class variables
        private String companyName;   //  Stores company name
        private String hours;         //  Restaurant hours
        private String phoneNumber;   //  Restaurant phone number
        private Menu[] menuList;      //  Array of menu objects
        private int menuCount;        //  Number of menus in the array

     }

包含类别数组的菜单

    public class Menu
    {   
        // Class constants

        // Class variables
        private String menuName;           //  Name of Menu
        private Category[] categoryList;   //  Array of category objects
        private int categoryCount;         //  Number of categories in the array

     }

包含菜单项数组的类别

    public class Category
    {   
        // Class constants

        // Class variables
        private String categoryName;       //  Name of Menu
        private MenuItem[] menItemList;    //  Array of MenuItem objects
        private int menuItemCount;         //  Number of menu items in the array

     }

包含姓名,价格和说明的单个订单项

    public class MenuItem
    {   
        // Class constants

        // Class variables
        private String name;        //  Name of Menu Item
        private float price;        //  Price of the Menu Item
        private String description; //  Description of the Menu Item

     }

在驱动程序类中,如果我只能访问公司的方法,我将如何更改菜单项中的任何内容?

我想过为每个私有数组项目设置一个getter,但是将3个级别挖掘到私有数组中似乎很难实现。它不像Company.Menu.Category.MenuItem.editName(newName);

那么简单

注意*我对"不感兴趣;应使用链接列表或ArrayList"答案。程序要求需要基本数组。

如果我需要更清楚或者你想要一个SSCCE,请告诉我。

3 个答案:

答案 0 :(得分:2)

  

我想过为每个私有数组项目设置一个getter,但是   将3个级别挖掘到私有阵列似乎非常困难   实行。它并不那么简单   Company.Menu.Category.MenuItem.editName(了newName);

实现并不困难,但它是一种反模式,可以连续调用getter,例如:

company.getMenu().getCategory().getMenuItem().editName(newName);

Demeter law 表示:

  

每个单位应该对其他单位的知识有限:仅   单位"密切关注"与当前单位有关。

     

每个单位只应与其朋友交谈;不要和陌生人说话。

     

只与你的直接朋友交谈。

因此,要解决您的问题,您必须重构您的设计,以便将对象从一个对象与另一个对象进行协作。

协作/级联方法

您可以定义由层次结构的每个对象连续调用的editItemName()方法。

Company可以定义方法,例如:

public void editItemName(String menuName, String categoryName, String itemName, String newName){ 
   Menu menu = findMenu(menuName);
   menu.editItemName(category, item, newName);
}

Menu可以定义方法,例如:

public void editItemName(String categoryName, String itemName, String newName){ 
   Category category = findCategory(categoryName);
   category.editItemName(item, newName);
}

Category可以定义方法,例如:

public void editItemName(String itemName, String newName){ 
   MenuItem item = findItem(itemName);
   item.editItemName(newName);
}

最后MenuItem可以定义方法,例如:

public void editItemName(String newName){
   this.name = newName;
}

更直接的方法(如果适用)

传递如此多的论点对于客户来说可能很麻烦。 作为替代,如果Item对象是唯一的(就equals()而言)并且您可以从客户端获取它,那么您可以使事情更简单。 您可能只需要将MenuItem(叶子)中的方法定义为:

public void editItemName(String newName){
   this.name = newName;
}

您可以定义按地址标识符存储项目的地图:

Map<String, MenuItem> mapUniqueItems = new HashMap<>();
// add items in the map
mapUniqueItems.put("item1", new MenuItem(..));
mapUniqueItems.put("item2", new MenuItem(..));
// add items in the hierarchy as you actually do
...

稍后您可以编辑其ID中的项目,例如:

String itemIdentifier = ...;
MenuItem item = mapUniqueItems.get(itemIdentifier);
item.editItemName("new value");

答案 1 :(得分:1)

如果要为必须从外部读取的成员创建getter方法,则必须深入挖掘以从Menu对象中获取所需信息。这就是封装的重点。如果将重复这些操作,您可以创建一个帮助程序类/方法来管理数组的各个级别。

答案 2 :(得分:1)

.的链接是一种不好的做法,你可以做下面的事情

在班级公司

中创建方法modifyMenu
  public class Company {
       public modifyMenu (int menuIndexToModify, int categoryIndex, MenuItem itemWithModification){
            menuList[menuIndexToModify].modifyMenuItem(categoryIndex, menuItemIndex, itemWithModification);
      }
  }

modifyMenuItem

中创建方法Menu
 public class Menu{
    public void modifyMenuItem(int categoryIndex, int menuItemIndex, MenuItem itemWithModification){
              categoryList[categoryIndex].modifyMenuItem(menuItemIndex,itemWithModification);
    }
 }

在班级modifyMenuItem

中创建Category方法
public class Category{
    public void modifyMenuItem(int menuItemIndex, MenuItem itemWithModification){
            menuItemList[menuItemIndex].modify(itemWithModification);
     }
 }

modify

中的克里特方法MenuItem
 public void modify( MenuItem itemWithModification){
      this.name = itemWithModification.name
      // assign other stes similarly
 }

现在您只需要调用方法modifyMenu,将参数传递给它。