java - 如何在双向关联中实例化不可变类?

标签 java immutability software-design

我有两个不可变类:UserDepartment,它们使用双向关联连接 - User 引用了 DepartmentDepartment 有一个 User 列表。如何使用提供的用户创建一个新的部门实例?

代码:

class User {
    private final Department department;
    private final String name;

    public User(Department department, String name) {
        this.department = department;
        this.name = name;
    }
}

class Department {
    private final List<User> users;
    private final String name;

    public Department(List<User> users, String name) {
        this.users = new ArrayList<>(users);
        this.name = name;
    }
}

最佳答案

我觉得在你的情况下你可以稍微修改你的设计并使用特殊的UsersBuilder,即

class Department {
    final List<User> users;
    final String name;

    public Department(String name) {
        this.users = UsersBuilder.buildUsers(this);
        this.name = name;
    }
}


class UsersBuilder {

    public static List<User> buildUsers(Department department) {
        List<User> usersList = new ArrayList<>();

        // add users to the list via department reference

        return Collections.unmodifiableList(usersList);
    }    
}

一般来说,在对象的构造函数完成之前使用对象的引用并不是一个好主意;但在这种特殊情况下,它看起来很安全。

在这种情况下这些对象真的是不可变的。

关于java - 如何在双向关联中实例化不可变类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29512910/

相关文章:

java - 如何将参数化方法传递给 Struts 2 操作的方法属性?

java - 集合在 Java 中是最终的是什么意思?

java - 需要外部数据的独立类/框架的设计

c# - 将参数传递给应用程序的最佳方式是什么?

java - Couchbase 查询看不到最近添加的文档

java - 如何使用命令行检查Java类的异常终止

设计模式

kotlin - 如何在 Kotlin 中创建不可变对象(immutable对象)?

algorithm - 一种用可变或不可变状态替换序列中事件的有效技术

wireshark - 像 Wireshark 这样的应用程序如何工作?