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”防止重新赋值,从而导致编译时错误。