谈谈final、finall、finalize有什么不同?
这片文章中有提到一点final的知识https://my.oschina.net/Pirvate/blog/2989190
-
final:可以用来修饰类、方法、变量,分别有不同的意义,final修饰的class代表不可以继承扩展,final的变量是不可修改的,而final的方法也是不可以重写的。
-
finally:是保证重点代码一定要执行的机制。一般与try-catch-finally连用,关闭io流,关闭JDBC连接,或者保证unlock锁
-
finalize:是java.lang.Object的一个方法,是保证对象在被垃圾收集前完成特定资源的回收。
finally那种情况下不被执行?
try {
// do something
System.exit(1);
} finally{
System.out.println(“Print from finally”);
}
这是一个特例。
对于finalize就了解就好。
扩展
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()【这是java9中的list特性】方法创建的本身就是不可变的list,会在add的时候报错。
我们说说immutable:
- mutable: 可变类型的对象:提供了可以改变其内部数据值的操作,其内部的值可以被重新更改
- immutable: 其内部的操作不会改变内部的值,一旦试图更改其内部值,将会构造一个新的对象而非对原来的值进行更改
两者的优缺点:
mutable | immutable | |
优 | 可变类型会减少数据的拷贝次数,从而其效率 要高于immutable | 内部数据的不可变导致其更加安全,可以用作多线程的共享对象而不必考虑同步问题 |
缺 | 可变类型由于其内部数据可变,所以其风险更大 | 由于内部数据不可变,所以对其频发修改会产生大量的临时拷贝,浪费空间 |
实现immutable 的类需要做到以下几点:
- class声明为final,
- 所有成员变量定义为private和final,不要事先setter方法
- 构造对象是,成员变量使用深度拷贝来初始化(这个会涉及到一个深拷贝的问题感兴趣的可以去看看),而不是直接赋值。
- 如果要实现getter方法,或者其他可能返回内部状态的方法,需要使用copy-on-write原则,创建私有copy。