为了账号安全,请及时绑定邮箱和手机立即绑定

为什么Throwable是一个类而不是接口?感激不尽

为什么Throwable是一个类而不是接口?感激不尽

POPMUISE 2019-08-14 00:13:02
我以前一直以为以able结尾的都是接口,今天发现Throwable是个类。
查看完整描述

2 回答

?
慕神8447489

TA贡献1780条经验 获得超1个赞

以前也有过这个疑问,正好发表一下自己的看法。
首先,以“-able”结尾大多数时候确实用来表示接口,但说到底这不过是一个约定,而不是语法要求。把它当成95%但不要当成100%。类似的还有以反写的域名作为包名、类名采用驼峰结构且以大写字母开头、常量全大写,这些都是约定,不遵守约定的不多,尤其是在正式项目中,但是也确实都存在。
其次,你会发现Java的异常机制里面是没有接口的,它的顶层类就是Throwable。也就是说,你要定义一个异常类,就必须继承另一个异常类,因为catch子句要求它必须捕获一个异常,而不是任意对象(Javascript就没有这个要求,因此你可以捕获任何对象作为异常)。
既然自定义的异常必须要继承另一个异常类,那么它就不能再继承别的类,这样就在很大程度上限制了异常类的用途,从而更有利于开发设计良好的程序。
比如,假设Throwable是一个接口,那么任何一个类都可以实现它,然后作为异常用catch来捕获,这就有点类似Javascript的情况了,违反了单一职责原则。所以现在Javascript也建议程序员尽量用专门的异常对象,而不是字符串,这样会让程序更明确。
当然了,如果你愿意,还是可以突破这个限制,比如定义一个异常类,继承Throwable的同时也实现其他接口,这样这个异常类也可以当成其他类来使用。只是一般没人这么干,因为继承接口就要实现接口中的所有方法,那么既然要实现所有方法,为什么不重新定义一个更合适的类来实现呢,重新定义还可以继承某个骨架抽象类,减少子类中的代码量,何乐而不为呢是不是?反过来Throwable如果是一个接口就没有这种隐含的约束,可能就会有大量的人这么干。
至于Throwable是否有状态的,应该是其次的原因,或者说是将Throwable定义成一个类所带来的额外好处。因为如果只是因为状态原因的话,Java当时完全可以先定义一个Throwable接口,里面有getMessage()等方法,然后再定义一个抽象类或具体类来实现这个接口(这个类可能就是现在的Exception来充当了)。毕竟JDK里面已经有太多这样的案例了,比如集合、流、JDBC、……
                            
查看完整回答
反对 回复 2019-08-14
?
万千封印

TA贡献1891条经验 获得超3个赞

谷歌搜whythrowableisaclassnotinterface即可以及答案在这个问题的第二个回答简单来说就是Throwable被设计成了一定是有状态的,所以就不能是interface了
                            
查看完整回答
反对 回复 2019-08-14
  • 2 回答
  • 0 关注
  • 695 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信