2015-04-16 15 views
0

朋友和同事。我有以下類:如何禁止使用相同參數創建兩個類對象?

public class Department { 
private String departmentName; 
private int moneyForDepartment; 

public Department(String departmentName, int moneyForDepartment){ 
    if (moneyForDepartment < 0){ 
     throw new IllegalArgumentException("invalid value"); 
    } 
    this.departmentName = departmentName; 
    this.moneyForDepartment = moneyForDepartment; 
} 

public Department(){ 

} 

public String getDepartmentName() { 
    return departmentName; 
} 

public void setDepartmentName(String departmentName) { 
    this.departmentName = departmentName; 
} 

public int getMoneyForDepartment() { 
    return moneyForDepartment; 
} 

public void setMoneyForDepartment(int moneyForDepartment) { 
    this.moneyForDepartment = moneyForDepartment; 
} 

}

和例如我將創建該類的兩個對象:

Department dep1 = new Department("Storage", 100000); 
Department dep2 = new Department("Storage", 200000); 

請告訴我,我怎麼能禁止的情況下,當創建類對象具有相同第一個參數的這個類的對象是否已經存在?

回答

6

在整個應用程序中(靜態狀態)執行全局操作可能不是一個好主意,因爲這樣測試就變得很困難。相反,建立一個工廠爲您Department類,也許看起來像這樣:

public class Department { 
    private Department(String departmentName, int moneyForDepartment) { ... } 
    ... 
    public static class Factory { 
    private Set<String> seenDepartmentNames = new HashSet<>(); 
    public Department create(String departmentName, int moneyForDepartment) { 
     if (!seenDepartmentNames.add(departmentName)) { 
      throw new IllegalArgumentException("Department already created"); 
     } 
     return new Department(departmentName, moneyForDepartment); 
    } 
    } 
} 

這將迫使所有建築都要經過Factory,因爲Department構造函數是私有的。只需在您的應用程序中使用一個Factory,並且您仍然可以創建新的測試而不會遇到問題。

+0

感謝路易斯,這就是非常好的解決方案!) –

0

您可以創建在Department類靜態字段,並保持與已使用的部門名稱的Set

public class Department { 
    private static final Set<String> usedDepartmentNames = new HashSet<>(); 
    ... 
} 

然後,在構造函數中,這樣做:

public Department(String departmentName, int moneyForDepartment) { 
    if (usedDepartmentNames.contains(departmentName)) { 
     throw new IllegalArgumentException("Department already exists"); 
    } 
    if (moneyForDepartment < 0){ 
     throw new IllegalArgumentException("invalid value"); 
    } 
    this.departmentName = departmentName; 
    this.moneyForDepartment = moneyForDepartment; 
    usedDepartmentNames.add(departmentName); 
} 
相關問題