小编Ben*_*nry的帖子

如何避免使用异常进行流量控制?

我被分配了一个项目来开发一组作为存储系统接口的类.要求是该类支持具有以下签名的get方法:

public CustomObject get(String key, Date ifModifiedSince)
Run Code Online (Sandbox Code Playgroud)

基本上该方法应该返回CustomObjectkeyif 关联的,并且只有在对象被修改之后才会返回ifModifiedSince.如果存储系统不包含,key则该方法应返回null.

我的问题是:

如何处理其中关键的存在,但该对象的情景已经被修改?

这很重要,因为使用此类的一些应用程序将是Web服务和Web应用程序.这些应用程序需要知道是返回404(未找到),304(未修改)还是200(OK,这是数据).

我正在权衡的解决方案是:

  1. 当存储系统不包含时,抛出自定义异常 key
  2. ifModifiedSince失败时抛出自定义异常 .
  3. 将状态属性添加到CustomObject.要求来电者查看房产.

我对这三个选项中的任何一个都不满意.我不喜欢选项1和2,因为我不喜欢使用流控制的异常.当我的目的是表明没有价值时,我也不喜欢返回.

尽管如此,我倾向于选择3.

有没有我不考虑的选择?有没有人对这三种选择中的任何一种都有强烈的感受?


这个问题的答案,转述:

  1. 提供一个contains 方法并要求调用者在调用之前调用它get(key, ifModifiedSince),如果key不存在则抛出异常,如果没有修改object则返回null.
  2. 将响应和数据(如果有)包装在复合对象中.
  3. 使用预定义常量表示某个state(UNMODIFIED, KEY_DOES_NOT_EXIST).
  4. 调用者实现了用作回调的接口.
  5. 设计很糟糕.

为什么我不能选择答案#1

我同意这是理想的解决方案,但我已经(不情愿地)被解雇了.这种方法的问题在于,在大多数使用这些类的情况下,后端存储系统将是第三方远程系统,如Amazon S3.这意味着一种contains方法需要往返于存储系统,这在大多数情况下会进行另一次往返.因为这会花费时间和金钱,所以不是一种选择.

如果没有这个限制,这将是最好的方法.

(我意识到我没有在这个问题中提到这个重要元素,但我试图保持简短.显然它是相关的.)


结论:

在阅读完所有答案之后,我得出的结论是,在这种情况下,包装器是最好的方法.基本上我会模仿HTTP,包括响应代码和内容正文(消息)的元数据(标题).

java exception return-type control-flow

9
推荐指数
2
解决办法
3941
查看次数

标签 统计

control-flow ×1

exception ×1

java ×1

return-type ×1