我被分配了一个项目来开发一组作为存储系统接口的类.要求是该类支持具有以下签名的get方法:
public CustomObject get(String key, Date ifModifiedSince)
Run Code Online (Sandbox Code Playgroud)
基本上该方法应该返回CustomObject
与key
if 关联的,并且只有在对象被修改之后才会返回ifModifiedSince
.如果存储系统不包含,key
则该方法应返回null.
我的问题是:
如何处理其中关键的存在,但该对象的情景已经不被修改?
这很重要,因为使用此类的一些应用程序将是Web服务和Web应用程序.这些应用程序需要知道是返回404(未找到),304(未修改)还是200(OK,这是数据).
我正在权衡的解决方案是:
key
ifModifiedSince
失败时抛出自定义异常
.我对这三个选项中的任何一个都不满意.我不喜欢选项1和2,因为我不喜欢使用流控制的异常.当我的目的是表明没有价值时,我也不喜欢返回值.
尽管如此,我倾向于选择3.
有没有我不考虑的选择?有没有人对这三种选择中的任何一种都有强烈的感受?
这个问题的答案,转述:
contains
方法并要求调用者在调用之前调用它get(key,
ifModifiedSince)
,如果key不存在则抛出异常,如果没有修改object则返回null.UNMODIFIED, KEY_DOES_NOT_EXIST
).为什么我不能选择答案#1
我同意这是理想的解决方案,但我已经(不情愿地)被解雇了.这种方法的问题在于,在大多数使用这些类的情况下,后端存储系统将是第三方远程系统,如Amazon S3.这意味着一种contains
方法需要往返于存储系统,这在大多数情况下会进行另一次往返.因为这会花费时间和金钱,所以不是一种选择.
如果没有这个限制,这将是最好的方法.
(我意识到我没有在这个问题中提到这个重要元素,但我试图保持简短.显然它是相关的.)
结论:
在阅读完所有答案之后,我得出的结论是,在这种情况下,包装器是最好的方法.基本上我会模仿HTTP,包括响应代码和内容正文(消息)的元数据(标题).