极客时间杨晓峰JAVA36讲内容总结与扩展(三)

谈谈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: 其内部的操作不会改变内部的值,一旦试图更改其内部值,将会构造一个新的对象而非对原来的值进行更改

两者的优缺点:

 mutableimmutable
可变类型会减少数据的拷贝次数,从而其效率 要高于immutable内部数据的不可变导致其更加安全,可以用作多线程的共享对象而不必考虑同步问题
可变类型由于其内部数据可变,所以其风险更大由于内部数据不可变,所以对其频发修改会产生大量的临时拷贝,浪费空间

实现immutable 的类需要做到以下几点:

  1. class声明为final,
  2. 所有成员变量定义为private和final,不要事先setter方法
  3. 构造对象是,成员变量使用深度拷贝来初始化(这个会涉及到一个深拷贝的问题感兴趣的可以去看看),而不是直接赋值。
  4. 如果要实现getter方法,或者其他可能返回内部状态的方法,需要使用copy-on-write原则,创建私有copy。

 

转载于:https://my.oschina.net/Pirvate/blog/3021349

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值