如何禁止创建两个具有相同参数的类对象?



朋友和同事。我有以下课程:

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

请告诉我,如果已经存在具有相同第一个参数的此类对象,我如何禁止创建类对象?

在整个应用程序(静态状态下)全局执行此操作可能不是一个好主意,因为这样测试就会变得困难。 相反,为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,您仍然可以创建新的应用程序进行测试,而不会遇到问题。

您可以在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);
}

最新更新