Java设计出checked exception有必要吗( 三 )
我们先看一下union type是什么。
Union type是用来表示一个对象要么是A这个type的,要么是B这个type的。比如我们可以定义个一个Union type File | IOError,表示这个对象要么是一个File,要么是一个IOError。
我们该怎么知道它到底是什么呢?这就需要用到pattern matching。我们可以借用switch的语法这样理解pattern matching:File|IOError result = FileUtil.open("somefile.txt");switch (result) { case File file: //.... case IOError err: //....}Java虽然不支持union type,但它的CE其实就是union type的一种特殊实现。比如我们完全可以这样定义:public class FileUtil { // 想象中的union type的写法 public File|IOError open(String filename); // Java的写法 public File open(String filename) throws IOError;}而对于CE的try..catch..其实就是pattern matching的一种语法糖。
之所以我们强调CE是union type,是因为我们想要有力地阐述下面这个事实:
union type是type signature的一部分,描述着函数的行为,这就意味着,CE本身就是正常执行流的一部分,是这个函数预期的行为。打开文件就是会正常地失败。查找HashMap里的key就是会正常地找不到——这些都是人们预料之内会发生的事,是自然而然的事情,也是library designer和user之间的一个约定(interface)。
如果不提供union type(或者不提供CE),人们会用更差的方法错误处理,导致更加严重的问题。比如使用tuple(File, IOError)当作函数返回值。tuple的含义就是这个函数可以同时给你一个File和IOError,也可以既不给你File也不给你IOError。或者更严重地,使用null表示失败,从而导致各种NPE。
而Java CE的真正问题可能是:try..catch..的写法太繁琐了,导致人们没有办法好好地利用这个功能,能不用CE就不用CE,甚至把本该用CE表示的东西用其他方法来写。而且try..catch..也很难写得很type-safe,因为它是语句不是expression。也许写成以下这样的expression style,人们对CE的想法会好一点:// 想象中的CE(用raises与RE的throws相区分)public class HashMap { public Item get(String key) raises NotFound; public void put(String key, Item value);}Item item = map.get("mykey") onraise NotFound { map.put("mykey", initialItem); cont initialItem; // 赋值操作 item \u0026lt;- initialItem};接下来说RE。
RE才是真正的exception,它并不是interface的一部分。之所以我们需要RE是因为我们需要encapsulation,需要modularity。
比如这个调用链A-\u0026gt;B-\u0026gt;C-\u0026gt;D,其中D会抛出一个异常,而A有能力处理这个异常。如果使用CE,那么B和C都需要知道如何处理这个异常,这就破坏了modularity的目的:模块和模块之间因为CE而耦合到了一起,一个模块的设计者需要知道所有它被使用的场合,以便正确地处理异常。
为了降低模块之间的耦合程度,我们才需要RE。
所以,CE和RE都是需要的,因为它们的目的是不一样的。
■网友
语言古老的设计跟当年IDE垃圾是离不开的,这种就是典型属于把view和model混在一起的东西。一个函数到底要check多少exception,是可以从函数体里面计算出来的。Java完全可以编译完之后把这些东西写进metadata里,想看的话让IDE帮你渲染出来就好了,顺便还能告诉你每一个exception是从哪来的,比自己维护一个列表不知道强多少倍。
在这里model就是代码,view就是checked exception的列表。Java想让你把view写进model里,这就违反了DRY(Don\u0026#39;t Repeat Yourself)的原则。函数体都那么清楚了,为啥非要我重复一遍。重复着一编又有啥用呢?
推荐阅读
- “厉行节约反对浪费”主题设计公益活动成果发布
- 趣头条|雪佛兰创界,外观设计大气,你会喜欢这款车吗?
- 环球车讯网|全新大众途观,外观的设计更加时尚,更加大气,“满满”的高级感
- 趣头条|日产奇骏,整体设计不错,你会喜欢吗
- 趣头条|大众ID.3外观设计风格极具未来感,太好看了
- 趣头条|威马推出EX5-Z曜石精英版车型,车身采用宽体设计,外形魁梧大气
- 趣头条|本田飞度,整体设计不错,你会喜欢吗
- 设计专业学生上传自己的作品,用哪个网站比较好
- dart这编程语言现在发展怎么样了,语法与Java,c#很相似,甚至更简洁
- 钟叔驾道|10万以内买SUV,这几款国产精品真心不错,设计精致配置高
