在Java中怎么创建不可变对象


💖The Begin💖点点关注,收藏不迷路💖

在Java中,创建不可变对象是一种良好的编程实践,有助于避免数据不一致性,提高线程安全性,并允许缓存对象的哈希码等。

1、定义不可变对象的规则

  • 对象的状态在构造后不能被修改。任何修改应该通过创建一个新对象来实现。
  • 所有字段应声明为 final,确保它们只能被赋值一次。
  • 对象的创建过程应正确无误,防止内部引用泄漏。
  • 如果类不打算被继承,可以考虑将其声明为 final。确保不要继承的 Class 修改了 immutability 特性。

2、实现不可变对象的步骤

2.1 将所有字段声明为 final

public final class ImmutablePerson {
           private final String name;
           private final int age;

           public ImmutablePerson(String name, int age) {
               this.name = name;
               this.age = age;
           }

           // 获取字段的方法
       }

2.1 提供Getter方法

public String getName() {
         return name;
       }

public int getAge() {
      return age;
    }

2.3 处理可变对象作为字段

如果类的字段是可变引用类型,请确保:

  • 在可能的情况下使用不可变对象。
  • 在构造函数或方法中进行防御性复制,避免通过外部引用修改对象状态。

2.4 考虑将类声明为 final

  public final class ImmutablePerson {
       // 类的定义
   }

2.5 避免泄露引用

确保在对象构造完成之前不要泄露对对象的引用。

2.6 其他注意事项

  • 防御性复制:在构造函数或方法中复制可变输入参数,以防止外部修改。
  • 静态工厂方法:使用静态方法封装对象的创建过程,提供更好的封装性。

3、不可变对象的示例代码

下面是一个不可变对象的示例:

这个 ImmutablePerson 类展示了通过将所有字段声明为 final、提供仅有的Getter方法,并确保对象状态在构造后不可修改来实现不可变性。

//类被声明为 final,这意味着它不能被继承,从而确保类的不可变性不会被破坏。
public final class ImmutablePerson {
//name 和 age 字段被声明为 private final。private 保证了这些字段只能在类内部访问,而 final 确保它们在初始化后不能被修改。
       private final String name;
       private final int age;

//构造函数 public ImmutablePerson(String name, int age) 接受 name 和 age 作为参数,并在对象创建时初始化这两个字段。由于 name 和 age 是 final 的,它们在对象构造后就不能被修改。
       public ImmutablePerson(String name, int age) {
           this.name = name;
           this.age = age;
       }

//getName() 和 getAge() 方法用于获取 name 和 age 字段的值,但没有提供对这些字段的修改方法(如 setName() 或 setAge()),从而确保对象状态的不可变性。
       public String getName() {
           return name;
       }

       public int getAge() {
           return age;
       }
   }

这种设计保证了一旦创建了 ImmutablePerson 对象,其 name 和 age 字段的值将保持不变,这对于多线程环境下的安全性尤为重要,同时也使得对象更容易进行缓存和重用,因为不必担心对象状态的改变。

通过这种方式,可以创建出在多种情况下都能表现良好且易于维护的不可变对象。

在这里插入图片描述


💖The End💖点点关注,收藏不迷路💖
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Seal^_^

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值