用Java创建不可变的类


在本文中,我们将定义在Java中创建不可变类并实现它的典型步骤。

在Java中创建不可变类的步骤

  1. 将您的班级定为最终班,以便其他班级无法对其进行扩展。
  2. 将所有字段设为私有,以便不允许直接访问。
  3. 不要提供“ setter”方法-修改字段或字段引用的对象的方法。
  4. 具有可变的实例变量时要特别注意
    1. 在构造函数内部,请确保使用传递的参数的克隆副本,并且切勿将可变字段设置为通过构造函数传递的真实实例。
    2. 确保始终返回该字段的克隆副本,并且永远不要返回真实对象实例。

Java中不可变类的实现

class Address{
    private String houseNumber;
    private String street;
    private String city;
}
class User{
    private int id;
    private String name;
    private String email;
    private Address address;
}-

假设上面有一个名为User的类,我们需要将其转换为Java中的Immutable类。让我们遵循规则,并在Java中将此User类转换为Immutable类。

final class User {
    private final int id;
    private final String name;
    private final String email;
    private final Address address;

    /*
     * To clone the address.
     */
    private static Address cloneAddress(Address address) {
        return new ObjectMapper().convertValue(address, Address.class);
    }
    User(int id, String name, String email, Address address) {
        this.id = id;
        this.name = name;
        this.email = email;
        /*
         * Any field contains reference of any mutable object must be
         * initialized with the cloned object
         */
        this.address = cloneAddress(address);
    }
    public int getId() {
        return id;
    }
    public String getName() {
        return name;
    }
    public String getEmail() {
        return email;
    }
    public Address getAddress() {
        /*
         * Getter method must return the reference of cloned object.
         */
        return cloneAddress(address);
    }
}

Java中的预定义不可变类

  1. 字符串类表示字符序列的不可变对象。
  2. 包装器类(例如Integer,Float,Long等)均表示相应原始类型的不可变对象。
  3. java.util.UUID代表唯一的128位十六进制字符串。

在Java中制作不可变类的好处

  1. 默认情况下,不可变对象是线程安全的。
  2. 不可变的对象可以很容易地被缓存。
  3. 不可变对象是在任何像HashMap这样的地图中用作关键对象的最佳选择。

结论 在本文中,我们已经看到了如何在java中创建Immutable类。不可变类为我们提供了许多优势,并且最适合多线程环境。我们还学习了组成不可变类的规则及其好处。

感谢您阅读本文。


原文链接:http://codingdict.com