浅谈final、finally、 finalize有什么不同

final、finally、 finalize定义

final定义:

Final是一个关键字,用于定义无法更改或以后无法衍生的实体。 final关键字在三种不同的上下文中使用。 例如,最终类,最终方法和最终变量。
final 可以用来修饰类、方法、变量,分别有不同的意义,final 修饰的 class 代表不可以继承扩展,final 的变量是不可以修改的,而 final 的方法也是不可以重写的(override)。

finally定义:

该finally块始终在try退出时执行。这样可以确保finally即使发生意外异常也可以执行该块。但是,finally是的不仅仅是异常处理更加有用-它允许程序员避免不慎被绕过具有清除代码return,continue或break。finally即使在没有异常的情况下,将清除代码放在块中始终是一个好习惯。

注意: 如果在执行try或catch代码时JVM退出,则该finally块可能不会执行。同样,如果执行try或catch代码的线程被中断或杀死,则finally即使整个应用程序继续运行,该块也可能不会执行。
在try该块writeList方法,你已经在这里工作与打开PrintWriter。程序应在退出writeList方法之前关闭该流。这造成了一个有点复杂的问题,因为writeList的try块可以通过以下三种方式之一退出。

该new FileWriter语句失败并抛出IOException。
该list.get(i)语句失败并抛出IndexOutOfBoundsException。
一切成功,该try块正常退出。
运行时系统始终执行finally块内的语句,而不管try块内发生什么。因此,这是执行清理的理想场所。

该方法的以下代码finally段将writeList清除,然后关闭PrintWriter。
最后

{
    if(out!= null){ 
        System.out.println(“关闭PrintWriter”);
        out.close(); 
    }其他{ 
        System.out.println(“ PrintWriter未打开”);
    } 
} 

Java 保证重点代码一定要被执行的一种机制。我们可以使用 try-finally 或者 try-catch-finally 来进行类似关闭 JDBC 连接、保证 unlock 锁等动作。

finalize定义:

finalize 是基础类 java.lang.Object 的一个方法,它的设计目的是保证对象在被垃圾收集前完成特定资源的回收。finalize 机制现在已经不推荐使用,并且在 JDK 9 开始被标记为 deprecated。

扩展

  1. 注意,final 不是 immutable!

我在前面介绍了 final 在实践中的益处,需要注意的是,final 并不等同于 immutable,比如下面这段代码:

 final List<String> strList = new ArrayList<>();
 strList.add("Hello");
 strList.add("world");  
 List<String> unmodifiableStrList = List.of("hello", "world");
 unmodifiableStrList.add("again");

final 只能约束 strList 这个引用不可以被赋值,但是 strList 对象行为不被 final 影响,添加元素等操作是完全正常的。如果我们真的希望对象本身是不可变的,那么需要相应的类支持不可变的行为。在上面这个例子中,List.of 方法创建的本身就是不可变 List,最后那句 add 是会在运行时抛出异常的。

Immutable 在很多场景是非常棒的选择,某种意义上说,Java 语言目前并没有原生的不可变支持,如果要实现 immutable 的类,我们需要做到:

将 class 自身声明为 final,这样别人就不能扩展来绕过限制了。

将所有成员变量定义为 private 和 final,并且不要实现 setter 方法。

通常构造对象时,成员变量使用深度拷贝来初始化,而不是直接赋值,这是一种防御措施,因为你无法确定输入对象不被其他人修改。

如果确实需要实现 getter 方法,或者其他可能会返回内部状态的方法,使用 copy-on-write 原则,创建私有的 copy。

这些原则是不是在并发编程实践中经常被提到?的确如此。

关于 setter/getter 方法,很多人喜欢直接用 IDE 一次全部生成,建议最好是你确定有需要时再实现。

总结

1 虽然单词看着类似但是意思完全不相同,初学者要注意不要混淆。
2 真实项目中final,和finally比较常用要多加练习。

猜你喜欢

转载自blog.csdn.net/aa327056812/article/details/109481860