2015-06-09 40 views
1

我正在製作庫存系統。只允許具有唯一名稱的對象 - Java

我想確保我創建的對象(成分)都有獨特的名稱。換句話說,我想確保在整個程序中不會有兩種成分同名。目前,我有以下類:

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」可能不是這裏的最佳做法。

+0

a)in'createIngredient(...)'你爲什麼返回' null'而不是已經創建的'Ingredient'? b)這基本上是內存泄漏的Java版本,因爲即使只有靜態字段「names」引用了「Ingredient」,它也不會被垃圾回收。你可能想看看[this](https://weblogs.java.net/blog/2006/05/04/understanding-weak-references)。 – Turing85

+0

這很好,如果您只是在嘗試,但是,如果您需要在多線程系統中運行該代碼,則會出現問題。 – Bill

+0

@ Turing85關於(a)...另一種方法是將已經創建的成分的實際指針存儲在一個集合中嗎? (我目前正在用他們的名字做什麼) –

回答

1

我不能評論,但無論... 我會通過將所有的成分存儲在不同的類,然後你不會需要所有這些靜態的廢話。在課堂上,你實際上是創建一個新的成分(Ingredient egg = Ingredient.createIngredient("egg", 1);),你也許可以創造成分的ArrayList像這樣:

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

然後,當你犯了一個新的Ingredient你只需要確保你將它添加到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; 
    } 
} 

然後你就可以訪問每一個人Ingredient用的方法通過ArrayList運行,並找到Ingredient用你要找的名字:

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

我認爲這是最簡單的,所以我去了這個。從本質上講,我有另一個班級,一個實際的庫存,當我去添加它,我只是檢查,以確保沒有一個同名的成分。如果有的話,我會拋出一個異常。謝謝! –

+0

我用這種方式做了很多:) –

1

我會建議,要麼

A)返回已經創建的成分

或者是否會混淆來電,

B)拋出一個異常

這可以是一個簡單的IllegalArgumentsException ,或根據您的需要定製一個異常類。

相關問題