有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

oop java:确保该类型只有一个实例

我遵循以下示例:
https://www.baeldung.com/java-composite-pattern

public class FinancialDepartment implements Department {

    private Integer id;
    private String name;

    public void printDepartmentName() {
        System.out.println(getClass().getSimpleName());
    }

    // standard constructor, getters, setters
}
public class SalesDepartment implements Department {

    private Integer id;
    private String name;

    public void printDepartmentName() {
        System.out.println(getClass().getSimpleName());
    }

    // standard constructor, getters, setters
}

public class HeadDepartment implements Department {
    private Integer id;
    private String name;

    private List<Department> childDepartments;

    public HeadDepartment(Integer id, String name) {
        this.id = id;
        this.name = name;
        this.childDepartments = new ArrayList<>();
    }

    public void printDepartmentName() {
        childDepartments.forEach(Department::printDepartmentName);
    }

    public void addDepartment(Department department) {
        childDepartments.add(department);
    }

    public void removeDepartment(Department department) {
        childDepartments.remove(department);
    }
}

我想阻止我自己在总部增加两个相同类型的职位

例如,如果对同一类型调用addaddDepartment两次,则应该只有一次

public class CompositeDemo {
    public static void main(String args[]) {
        Department salesDepartment = new SalesDepartment(
          1, "Sales department");

        Department salesDepartment2 = new SalesDepartment(
          1, "Sales department");
        Department salesDepartment3 = new SalesDepartment(
          3, "Sales department");


        Department financialDepartment = new FinancialDepartment(
          2, "Financial department");

        HeadDepartment headDepartment = new HeadDepartment(
          3, "Head department");

        headDepartment.addDepartment(salesDepartment);
        headDepartment.addDepartment(financialDepartment);

        // only keep the latest of same instanceof ie replace
        headDepartment.addDepartment(salesDepartment2);
        headDepartment.addDepartment(salesDepartment3);

        // this should only print twice one for salesDepartment3 and financialDepartment
        headDepartment.printDepartmentName();

    }
}

我想我只是迭代列表,如果instanceof,replace和put

public void addDepartment(Department department) {
        childDepartments.add(department);
    }

我也想保留订单如果Instanceof Department是第一个,我希望它保留为第一个,这意味着它应该在Financial Department之前打印salesDepartment3


共 (1) 个答案

  1. # 1 楼答案

    addDepartment()需要遍历子对象列表,并将每个子对象的类与要添加的对象的类进行比较。 伪代码:

    Class addClass = itemToAdd.getClass();
    for each child
    {
        if (child.getClass() == addClass)
        {
            //class is already in the list so replace it.
        }