Java 中的 final 与不变性


Java 中的“final”关键字可用于定义常量值,以及防止变量、方法或类被更改或覆盖。另一方面,不变性描述了对象在其整个生命周期中保持恒定状态的特性。对象一旦创建,其值就不会改变。

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

让我们在这篇文章中了解 final 与不变性之间的关键区别。

Java 中的 Final

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

  • Final 变量:初始化后无法修改其初始值。它们通常用于声明不可更改或恒定的值。

  • Final 方法:子类无法修改它们,保证它们的行为一致。它们有助于保持重要过程的有效性。

  • Final 类:其他类无法扩展它们,保证其实现不会被更改。Final 类通常用于构建安全或实用程序类。

  • 初始化:为了确保 final 变量具有已知的值,必须在声明时或在构造函数中为其赋值。

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

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

Java 中的不变性

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

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

  • 将类的成员变量声明为 private 以限制直接访问。

  • 将成员变量声明为 final 以防止对象创建后修改。

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

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

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

final 和不变性之间的区别

在 Java 编程中,理解“final”和“immutable”(不变)之间的区别至关重要。

  • Final:保留对象引用并允许状态变异

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

  • Immutable:不变的值和引用灵活性

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

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

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

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

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

StringBuffer()

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

算法

  • 步骤 1:声明一个变量“sb”作为初始值为“Hello”的 final StringBuffer 对象。

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

  • 步骤 3:打印“sb”的更新值,它将是“HelloTP”。

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

  • 步骤 5:打印“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

结论

总而言之,“final”和不变性在 Java 中具有不同的特性。“final”关键字限制了对象引用的重新赋值,但允许修改对象的状态。

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

更新于: 2023-07-11

1K+ 次浏览

开启您的 职业生涯

通过完成课程获得认证

开始学习
广告