首页 > 文章列表 > Java中的Final与不可变性比较

Java中的Final与不可变性比较

java final 不可变性
234 2023-08-26

Java 中的“final”关键字可用于定义常量值以及防止变量、方法,或类被更改或覆盖。另一方面,不变性描述了对象在其存在过程中保持恒定状态的特征。对象形成后,其值就不会改变。

变量、方法和类受到“final”关键字的限制,但不变性更进一步,保证了对象的整个状态得到保留。

让我们在本文中了解最终与不变性之间的主要区别。

Java 最终版

Java中的final关键字有几个特点:

  • 最终变量:初始化后其初始值无法修改。它们经常被用来声明不可更改或不变的值。

  • 最终方法:它们不能被子类修改,保证它们的行为一致。它们有助于保持重要程序的有效性。

  • 最终类:它们无法被其他类扩展,保证它们的实现不被改变。 Final 类经常用于构建安全性或实用程序类。

  • 初始化:为了确保最终变量具有已知值,必须在声明期间或构造函数中为其赋予值。

  • 性能:final 的使用使编译器能够更成功地优化代码,从而可能提高性能。

  • 安全性:Final 通过防止未经授权的敏感数据或行为更改来提高 Java 程序的安全性。

Java 中的不变性

在 Java 中,不可变类是指对象的内容一旦创建就无法更改的类。要创建不可变类,请遵循以下要求:

  • 将类声明为 Final 以防止继承。

  • 将类的数据成员声明为私有以限制直接访问。

  • 将数据成员声明为final,以防止在对象创建后进行修改。

  • 使用参数化构造函数通过深拷贝初始化所有字段,防止通过对象引用进行修改。

  • 在 getter 方法中返回对象的副本(深层副本),而不是实际的对象引用,以保持不变性。

通过遵循这些特性,您可以在 Java 中创建自己的不可变类,类似于 Integer、Boolean、Byte、Short 和 String 等内置不可变类。

最终和不变性之间的差异

当谈到 Java 编程时,理解“final”和“immutable”之间的区别至关重要。

  • 最终:保留对象引用并允许状态突变

    让我们从“最终”开始。当一个对象或变量在Java中被标记为final时,这意味着在给它一个值之后,该引用不能更改为指向另一个对象或变量。重要的是要记住,尽管引用是固定的,但使用相关的 setter 方法仍然允许您更改对象的状态。因此,即使引用本身无法更改,您仍然可以使用可访问的方法来更改对象的内部属性或属性。换句话说,final 确保对象引用的稳定性,同时允许更改其内部状态。

  • 不可变:不可变值和引用灵活性

    现在让我们将注意力转向“不可变”。在Java中,不变性是指对象在创建后其实际值不能更改。但是,与 Final 不同的是,您可以修改引用本身并将其分配给另一个对象或变量。这意味着虽然对象的值保持不变,但您可以更改其引用以指向不同的实例。

  • 应用和范围:Final 和不变性

    修饰符“final”适用于 Java 中的变量而不是对象。它强调对更改引用或变量的限制,同时允许修改对象的状态。另一方面,不变性适用于对象,表明它们的值一旦创建就不能更改。必须了解这两个概念之间的区别,以确保 Java 程序达到预期的行为。

  • 含义:对象地址和状态可变性

    当我们将一个对象或变量声明为final时,我们就强制其地址的永久性。换句话说,引用保持固定,防止其指向的位置发生任何变化。相比之下,不变性强调了对象一旦创建就无法修改其状态。这意味着对象的内部值无法更改,从而在整个程序执行过程中保持其完整性和一致性。

StringerBuffer()

该代码演示了 Java 中“final”关键字和不变性之间的区别。 “final”关键字使变量成为常量并防止重新分配,而不变性意味着对象本身不能被修改。

算法

  • 第 1 步:声明变量“sb”作为最终 StringBuffer 对象,初始值为“Hello”。

  • 第2步:使用append()方法将“TP”追加到“sb”引用的StringBuffer对象中。

  • 第 3 步:打印“sb”的更新值,即“HelloTP”。

  • 第 4 步:尝试将新的 StringBuffer 对象重新分配给变量“sb”,这会导致编译时错误。

  • 第五步:打印“sb”的值,但由于上一步错误,该行不会被执行。

示例

// Java program to illustrate difference between final and immutability
 
public class Tutorialspoint {
    public static void main(String[] args)
    {
        final StringBuffer sb = new StringBuffer("Hello");
 
        //  We can make changes even though reference variable sb is final

        sb.append("TP");
 
        System.out.println(sb);
 
        // Compile time error will appear here. This is because the final variable cannot be reassigned

        sb = new StringBuffer("Hello World");
 
        System.out.println(sb);
    }
}

输出

Tutorialspoint.java:16: error: cannot assign a value to final variable sb
        sb = new StringBuffer("Hello World");
        ^
1 error

结论

总而言之,“最终”和不变性在 Java 中具有截然不同的特征。 “final”关键字限制对象引用的重新分配,但允许修改对象的状态。

相反,不变性可以防止更改对象的值,但允许重新分配引用。了解“final”和不变性的应用和范围对于设计可靠的 Java 程序非常重要。当一个对象或变量被声明为final时,它的地址保持固定,而不变性则确保对象的内部值不能被修改。示例代码演示了其中的差异,其中“final”阻止重新分配,从而导致编译时错误。