最佳实践,涉及两个与Java相关的类,例如Recipe和Ingredient

时间:2018-09-08 17:17:29

标签: java class

我有两个类别的食谱和成分(带有:成分名称,数量,单位)和两种连接这两个类别的方法。

  1. 配方对象包含成分对象列表 (列表或ArrayList)。
  2. 配料对象包含相关配方对象的ID。

考虑到我将需要在应用程序中找出哪些食谱对象包含特定成分的事实,这是最佳的性能实践。

非常感谢您!

1 个答案:

答案 0 :(得分:0)

要允许Recipe分别引用一种成分类型和该成分的数量,我建议创建一个Ingredient类和一个IngredientQuantity类。

Ingredient类表示一种成分,但不知道数量。作为一个简单的起点,Ingredient类可能只包含保存成分名称的String,但是您可以添加其他字段来表示有关此成分类型的其他有用数据。稍后,我们需要在Ingredient中使用此Map类作为键,因此请确保在equals()中覆盖hashCode()Ingredient方法类,否则它将无法用作键。

IngredientQuantity类代表特定数量的特定成分,其轮廓可能如下所示:

public final class IngredientQuantity {

    public static enum QuantityUnit {
        // Add other unit types here.
        PIECE, MILLILITRE, GRAMME
    }

    private final Ingredient ingredient;
    private final QuantityUnit unit;
    private final double quantity;

    public IngredientQuantity(Ingredient ingredient, QuantityUnit unit,
            double quantity) {
        this.ingredient = Objects.requireNonNull(ingredient);
        this.unit = Objects.requireNonNull(unit);
        this.quantity = quantity;
        if (quantity < 0) {
            throw new IllegalArgumentException("Quantity cannot be negative.");
        }
    }   
}

(这已简化,因此您必须添加getter方法和其他必需的功能。)

现在您的Recipe类可以包含一个Collection<IngredientQuantity>,它描述了食谱所需的每种成分的数量。如果您对每个成分类型只允许一次感到偏执,那么可以使用Map<Ingredient, IngredientQuantity>来检测重复项。但是,如果您可以控制食谱对象的构建,那么无论如何应该避免重复。

无论哪种方式,您现在都可以从Recipe到所需的Ingredient对象的集合中。

要从IngredientRecipe,您需要建立一个Map<Ingredient, Set<Recipe>>,它将每个Ingredient对象映射到所有需要Recipe的对象该成分类型。在将配方读入应用程序时,您需要填充此内容,迭代每个配方的成分,然后在地图中的Recipe键下将Ingredient添加到地图中。

如果您的应用程序包含大量配方,因此在应用程序启动时无法读取所有配方,则必须将映射数据与配方数据一起存储,例如数据库或数据文件结构本身。但这是一个非常不同的问题。