java - 仅允许具有唯一名称的对象 - Java

标签 java

我正在制作一个库存系统。

我想确保我正在创建的对象(成分)都有唯一的名称。换句话说,我想确保整个程序中永远不会有两个具有相同名称的成分。目前我有以下类(class):

package ingredient;

import java.util.HashSet;

public class Ingredient {

private final String name;
private final double price;

private static HashSet<String> names = new HashSet<String> ();

private Ingredient(String ingr_name, double ingr_price) {
    name = ingr_name;
    price = ingr_price;
}

public static Ingredient createIngredient(String ingr_name, double ingr_price) {
    if (names.contains(ingr_name)) {
        return null;
    } else {
        names.add(ingr_name);
        return new Ingredient(ingr_name, ingr_price);
    }
}

public String getName() {
    return name;
}

public double getPrice() {
    return price;
}

}

然后,当我实际制作新原料时,我会做出如下声明:

Ingredient egg = Ingredient.createIngredient("egg", 1);

这样的设计好吗?我想我很担心,因为返回“NULL”可能不是这里的最佳实践。

最佳答案

我无法发表评论,但无论如何...... 我会通过将所有成分存储在不同的类中来解决此问题,然后您就不需要所有这些静态废话。在您实际创建新成分的类中 (Ingredient Egg = Ingredient.createIngredient("egg", 1);),您可以创建一个 ArrayList 成分,如下所示:

ArrayList<Ingredient> ingredients = new ArrayList<>();

然后,当您制作新的成分时,您只需确保将其添加到ArrayList中,并且在执行此操作时,检查是否没有任何成分已经在那里了,也许是这样的:

createIngredient("egg", 1);

Ingredient egg = createIngredient("egg", 1);

...

private Ingredient createIngredient(String ingr_name, double ingr_price){
    for(Ingredient i : ingredients){
        if(i.getName().equals(ingr_name)){
            return null;
        }
    }
    Ingredient newing = new Ingredient(ingr_name, ingr_price);
    ingredients.add(newing);
    return newing;
}

然后,Ingredient 类可以简化为如下所示:

package ingredient;

public class Ingredient {

    private final String name;
    private final double price;

    public Ingredient(String ingr_name, double ingr_price) {
        name = ingr_name;
        price = ingr_price;
    }

    public String getName() {
        return name;
    }

    public double getPrice() {
        return price;
    }
}

然后,您可以通过运行 ArrayList 的方法来访问每个单独的 Ingredient,并找到具有您要查找的名称的 Ingredient :

public Ingredient findIngredient(String name){
    for(Ingredient i : ingredients){
        if(i.getName().equals(name)){
            return i;
        }
    }
    return null;
}

关于java - 仅允许具有唯一名称的对象 - Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30739370/

相关文章:

java - 在用户定义的 Java 类中创建 ArrayList

java - 如何使用 while 循环找到最大变量?

java - 获取单词的五个连续组合

java - 将通用集合转换为函数参数

java - 通过 Java 或 Shell 脚本在 Linux 上以编程方式启动 VPN 连接

java - JWebBrowser NoClassDefFoundError 错误

java - 通过套接字发送对象java

java - 如何检查字符串是否具有特定模式

JAVA SE7 关于显式转换的问题

Java 属性 - int 变为 null