加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 如何避免使用异常流控制?

发布时间:2020-12-14 19:27:32 所属栏目:Java 来源:网络整理
导读:我被分配了一个项目来开发一组充当存储系统的接口的类.一个要求是类支持具有以下签名的get方法: public CustomObject get(String key,Date ifModifiedSince) 基本上,当且仅当对象在ifModifiedSince之后被修改时,该方法应该返回与该关键字关联的CustomObject
我被分配了一个项目来开发一组充当存储系统的接口的类.一个要求是类支持具有以下签名的get方法:
public CustomObject get(String key,Date ifModifiedSince)

基本上,当且仅当对象在ifModifiedSince之后被修改时,该方法应该返回与该关键字关联的CustomObject.如果存储系统不包含密钥,则该方法应返回null.

我的问题是这样的:

如何处理密钥存在但对象尚未修改的情况?

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

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

>抛出一个自定义异常
存储系统不包含

>抛出一个自定义异常
ifModifiedSince失败.
>将属性添加到CustomObject.要求来电者检查财产.

我对这三个选项都不满意.我不喜欢选项1和2,因为我不喜欢使用例外流控制.当我的意图是表示没有价值时,我也不喜欢返回值.

不过,我倾向于选择3.

有没有选择我不考虑?有人对这三种选择有强烈的感觉吗?

这个问题的答案,释义:

>提供一个包含
方法,并要求调用者调用它
在调用get(key,
ifModifiedSince),throw
异常如果键不存在,
如果对象尚未返回null
改性.
包装回应和数据(如果有的话)
在复合对象中.
>使用预定义的常量来表示一些状态(UNMODIFIED,KEY_DOES_NOT_EXIST).
> Caller实现接口
用作回调.
>设计很烂

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

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

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

(我意识到我没有提到这个问题的重要因素,但我正在努力保持简短,显然这是相关的.)

结论:

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

解决方法

听起来你真的想要返回两个项目:响应代码和找到的对象.您可能会考虑创建一个轻量级的包装器,它们既可以同时保存,也可以将它们返回.
public class Pair<K,V>{
  public K first;
  public V second;
}

然后,您可以创建一个保存您的响应代码和数据的新对.作为使用泛型的副作用,您可以再次使用这个包装器来实现所需的任何对.

另外,如果数据没有过期,你仍然可以返回,但是给它一个303代码让他们知道它没有变化. 4xx系列将与null配对.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读