gpt4 book ai didi

java - 访问私有(private)数组中对象的私有(private)变量

转载 作者:行者123 更新时间:2023-11-29 08:29:54 24 4
gpt4 key购买 nike

我想创建一个可以有多个菜单的 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

}

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

我考虑过为每个私有(private)数组项设置一个 getter,但将 3 个级别向下挖掘到私有(private)数组似乎很难实现。它不像 Company.Menu.Category.MenuItem.editName(newName); 这么简单;

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

让我知道是否需要更清楚,或者您是否想要 SSCCE。

最佳答案

I thought about having a getter for each private array of items, but digging down 3 levels into private arrays seems very difficult to implement. It's not as simple as Company.Menu.Category.MenuItem.editName(newName);

实现起来并不难,但是连续调用 getter 是一种反模式,例如:

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

Demeter law 状态为:

Each unit should have only limited knowledge about other units: only units "closely" related to the current unit.

Each unit should only talk to its friends; don't talk to strangers.

Only talk to your immediate friends.

因此,要解决您的问题,您将不得不重构您的设计,使您的对象之间相互协作。

协作/级联方法

您可以定义一个 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,通过标识符存储项目:

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

关于java - 访问私有(private)数组中对象的私有(private)变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49206168/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com