Java Top.

使用Spring 5和Spring Boot 2开始,通过学习春天课程:

>>查看课程

1.概述

在本教程中,我们将学习什么使对象不可变,如何在Java中实现不变性,以及这样做的优势。

什么是一个不可变的对象?

一个不可变的物体是一个在完全创建后,内部状态保持不变的对象

这意味着不可变形物体的公共API保证我们在整个寿命期间它将以相同的方式行事。

如果我们看看班级细绳,我们可以看到,即使它的API似乎为我们提供了一种可变的行为代替方法,原版细绳没有改变:

字符串名称=“baeldung金宝搏188体育”;string newname = name.replace(“粪便”,“----”);assertequals(“金宝搏188体育baeldung”,名称);assertequals(“bael ----”,newname);

API给出了我们只读方法,它永远不应包括更改对象内部状态的方法。

3.最终的java中的关键字

在尝试在Java中实现不动情之前,我们应该谈谈金宝搏官网188be最终的关键词。

在Java,变量默认是可变的,这意味着我们可以更改他们持有的值

通过使用最终的关键字声明变量时,Java编译器将不会让我们更改该变量的值。相反,它将报告编译时错误:

最终字符串名称=“baeldung”;金宝搏188体育name =“bael ......”;

注意最终的仅禁止我们从更改参考的可变保留,它不会保护我们从更改它引用的对象的内部状态:

最终列表 strings = new arraylist <>();assertequals(0,strings.size());strings.add(“金宝搏188体育baeldung”);assertequals(0,strings.size());

第二assertequals.将失败,因为向列表添加元素改变其大小,因此,它不是一个不可变的对象。

4. java中的不可动态

既然我们已经知道了如何避免更改变量的内容,那么我们就可以使用它来构建不可变对象的API。

构建不可变性对象的API要求我们保证无论我们如何使用其API,它的内部状态不会改变。

向前方向前进的一步是使用最终的声明其属性时:

班级金额{私人最终双倍金额;私人最终货币;// ......}

请注意,Java保证我们的价值数量不会更改,这是所有原始类型变量的情况。

但是,在我们的示例中,我们只能保证货币不会改变,所以我们必须依赖货币API保护自己免受变化

大多数情况下,我们需要对象的属性来保持自定义值,并且初始化不可变形对象的内部状态的位置是其构造函数:

班级金钱{// ...公共资金(双金额,货币货币){this.amount =金额;这个.Currency =货币;公共货币GetCurrency(){返回货币;public double getaMount(){返回金额;}}

正如我们之前所说的那样,满足不可变API的要求,我们类只有只读方法。

使用反射API,我们可以打破不变性和改变不可变的物体。然而,反思违反了不可变的对象的公共API,通常,我们应该避免这样做。

5.好处

由于不可变形物体的内部状态及时保持不变,我们可以安全地将其分享到多个线程中

我们也可以自由使用它,并且没有任何对象引用它会注意到任何区别,我们可以这么说不可变的物体自由副作用

六,结论

不可变的物体不会及时改变其内部状态,它们是线程安全和副作用。由于这些属性,在处理多线程环境时,不可变的物体也特别有用。

您可以找到本文中使用的示例在GitHub

Java底部

使用Spring 5和Spring Boot 2开始,通过学习春天课程:

>>查看课程
评论在本文上关闭!