final、finally、finalize有什么不同?

fnal可以用来修饰类、方法、变量,分别有不同的意义,fnal修饰的 class代表不可以继承扩展,fnal的变量是不可以修改的,而fnal的方法也是不可以重写的(override)
finally则是java保证重点代码一定要被执行的一种机制。使用try-finally或者try-catch-finally来进行类似关闭JDBC链接。保证unlock锁等动作。
finalize是基础类java.lang.Object的一个方法,他的设计目的是保证对象在被垃圾收集前完成特定资源的回收。finalize机制不推荐使用,jdk9开始被标记为deprecated。
使用final修饰参数或者变量,也可以清楚地避免意外赋值导致的编程错误。final变量产生了某种程度的不可变的效果,所以,可以用于保护只读数据,有利于减少额外的同步开销。

finally特例:

try{
	System.exit(1);
} finally {
	System.out.printly("Print from finally");
}

上面的finally里面的代码不会被执行。

对于finalize,不推荐使用,java9中明确将object.finalize()标记为deprecated(弃用),如果没有特别的原因,不要实现finalize方法。因为你无法保证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方法创建的本身是不可变List,最后add运行时会抛出异常。

某种意义上说,java目前并没有原生的不可变支持,如果要实现immutable的类,需要做到:
·将class自身声明为final,这样别人就不能扩展来绕过限制
·将所有成员变量定义为private和final,并且不要实现setter方法
·通常构造对象时,成员变量使用深度拷贝来初始化,并不是直接赋值,这是一种防御措施,因为你无法确定输入对象不被其他人修改
·如果要实现getter方法,或者其他可能会返回内部状态的方法,使用copy-on-write原则,创建私有的copy

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值