java的throwable类属于,【java】为什么Throwable是一个类而不是接口?

我以前一直以为以able结尾的都是接口,今天发现Throwable是个类。

回答

以前也有过这个疑问,正好发表一下自己的看法。

首先,以“-able”结尾大多数时候确实用来表示接口,但说到底这不过是一个约定,而不是语法要求。把它当成 95% 但不要当成 100%。类似的还有以反写的域名作为包名、类名采用驼峰结构且以大写字母开头、常量全大写,这些都是约定,不遵守约定的不多,尤其是在正式项目中,但是也确实都存在。

其次,你会发现 Java 的异常机制里面是没有接口的,它的顶层类就是Throwable。也就是说,你要定义一个异常类,就必须继承另一个异常类,因为catch子句要求它必须捕获一个异常,而不是任意对象(Javascript 就没有这个要求,因此你可以捕获任何对象作为异常)。

既然自定义的异常必须要继承另一个异常类,那么它就不能再继承别的类,这样就在很大程度上限制了异常类的用途,从而更有利于开发设计良好的程序。

比如,假设Throwable是一个接口,那么任何一个类都可以实现它,然后作为异常用catch来捕获,这就有点类似 Javascript 的情况了,违反了单一职责原则。所以现在 Javascript 也建议程序员尽量用专门的异常对象,而不是字符串,这样会让程序更明确。

当然了,如果你愿意,还是可以突破这个限制,比如定义一个异常类,继承Throwable的同时也实现其他接口,这样这个异常类也可以当成其他类来使用。只是一般没人这么干,因为继承接口就要实现接口中的所有方法,那么既然要实现所有方法,为什么不重新定义一个更合适的类来实现呢,重新定义还可以继承某个骨架抽象类,减少子类中的代码量,何乐而不为呢是不是?反过来Throwable如果是一个接口就没有这种隐含的约束,可能就会有大量的人这么干。

至于Throwable是否有状态的,应该是其次的原因,或者说是将Throwable定义成一个类所带来的额外好处。因为如果只是因为状态原因的话,Java 当时完全可以先定义一个Throwable接口,里面有getMessage()等方法,然后再定义一个抽象类或具体类来实现这个接口(这个类可能就是现在的Exception来充当了)。毕竟 JDK 里面已经有太多这样的案例了,比如集合、流、JDBC、……

谷歌搜 why throwable is a class not interface 即可

以及答案在这个问题的第二个回答

简单来说就是Throwable被设计成了一定是有状态的,所以就不能是interface了

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值