微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我被分配了一个项目来开发一组充当存储系统的接口的类.一个要求是类支持具有以下签名的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配对.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


应用场景 C端用户提交工单、工单创建完成之后、会发布一条工单创建完成的消息事件(异步消息)、MQ消费者收到消息之后、会通知各处理器处理该消息、各处理器处理完后都会发布一条将该工单写入搜索引擎的消息、最终该工单出现在搜索引擎、被工单处理人检索和处理。 事故异常体现 1、异常体现 从工单的流转记录发现、
线程类,设置有一个公共资源 package cn.org.chris.concurrent; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * @Descrip
Java中的数字(带有0前缀和字符串)
在Java 9中使用JLink的目的是什么?
Java Stream API Filter(过滤器)
在Java中找到正数和负数数组元素的数量
Java 9中JShell中的不同启动脚本是什么?
使用Java的位填充错误检测技术
java中string是什么
如何使用Java中的JSON-lib API将Map转换为JSON对象?