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

Java 如何禁止创建具有相同参数的两个类对象?,java,Java,朋友和同事。我有以下课程: public class Department { private String departmentName; private int moneyForDepartment; public Department(String departmentName, int moneyForDepartment){ if (moneyForDepartment < 0){ throw new IllegalArgumentException("

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

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

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

在整个应用程序中全局执行该操作(在静态状态下)可能不是一个好主意,因为这样测试会变得困难。相反,为您的
部门
类创建一个工厂,可能如下所示:

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);
     }
  }
}
公共课部{
私人部门(字符串部门名称,int moneyForDepartment){…}
...
公共静态类工厂{
私有集seenDepartmentNames=new HashSet();
公共部门创建(字符串departmentName,int moneyForDepartment){
如果(!seenDepartmentNames.add(departmentName)){
抛出新的IllegalArgumentException(“部门已创建”);
}
返回新部门(部门名称,moneyForDepartment);
}
}
}

这迫使所有构造都经过
Factory
,因为
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);
     }
  }
}
公共课部{
私人部门(字符串部门名称,int moneyForDepartment){…}
...
公共静态类工厂{
私有集seenDepartmentNames=new HashSet();
公共部门创建(字符串departmentName,int moneyForDepartment){
如果(!seenDepartmentNames.add(departmentName)){
抛出新的IllegalArgumentException(“部门已创建”);
}
返回新部门(部门名称,moneyForDepartment);
}
}
}

由于
部门
构造函数是私有的,因此这迫使所有构造都要经过
工厂
。只需在应用程序中使用一个
工厂
,您仍然可以创建新的工厂进行测试,而不会出现问题。

您可以在
部门
类中创建一个静态字段,并使用已使用的部门名称保留一个
集合

public class Department {
    private static final Set<String> usedDepartmentNames = new HashSet<>();
    ...
}
公共课部{
私有静态最终集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);
}
公共部门(字符串departmentName,int moneyForDepartment){
if(usedDepartmentNames.contains(departmentName)){
抛出新的IllegalArgumentException(“部门已存在”);
}
如果(部门费用<0){
抛出新的IllegalArgumentException(“无效值”);
}
this.departmentName=部门名称;
this.moneyForDepartment=moneyForDepartment;
usedDepartmentNames.add(部门名称);
}

您可以在
部门
类中创建一个静态字段,并使用已使用的部门名称保留一个
集合

public class Department {
    private static final Set<String> usedDepartmentNames = new HashSet<>();
    ...
}
公共课部{
私有静态最终集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);
}
公共部门(字符串departmentName,int moneyForDepartment){
if(usedDepartmentNames.contains(departmentName)){
抛出新的IllegalArgumentException(“部门已存在”);
}
如果(部门费用<0){
抛出新的IllegalArgumentException(“无效值”);
}
this.departmentName=部门名称;
this.moneyForDepartment=moneyForDepartment;
usedDepartmentNames.add(部门名称);
}