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