java - 如何在不使用异常的情况下从方法返回失败详细信息并可选择包含一个值?

标签 java generics exception inheritance exception-handling

首先是一些背景:

我已经实现了一个 Result 类来携带结果信息。它们是专门为失败而实现的,成功的结果通常不包含其他信息。我在我的一个项目的核心 API 外部的公共(public)方法中使用它们,或者在我需要将详细信息传回公共(public) API 的一两层深处的方法中使用它们。此 API 在容器和命令行客户端中使用,并且以前非常适合检查异常。另一种方法是将此失败上下文信息添加到异常中,并在它们不属于的地方添加几个不同的异常类。我想这反射(reflect)了我的一般方法:

http://blogs.atlassian.com/2011/05/exceptions_are_bad

Result 有一个支持的枚举和接口(interface):

  1. ResultStatus:SUCCESS、FAILURE、CONDITIONAL_SUCCESS 等。保存 int 返回代码和通用消息(例如“操作成功”)
  2. ResultCode:用于标记枚举结果代码、FILE_NOT_FOUND、FILE_INVALID、FILE_INCOMPATIBLE 的空接口(interface)。这些主要用于单元和功能测试,但也用于在线帮助(Maven 的失败帮助在功能上与我正在做的类似)

Result 为状态提供静态工厂方法,并为设置其他关键字段提供构建器方法,并且是不可变的。以下是构建结果的样子:

Result.success().withCode( ResultCode ).withMessage( "" );

并评估返回的结果:

result.isSuccessful();
result.hasCode( ResultCode );
result.getMessage();

我的问题:

该方法非常成功,特别是使功能测试变得轻而易举,但是我有一个主要差距:虽然在大多数情况下我只关心结果,但在某些关键领域我需要返回一个值和结果.

我对我的第一次尝试不满意:ResultPair<T>其中包含结果和值,其中 T 是值的类型。除非我复制所有的 Result 方法,否则使用该类是冗长和笨拙的:获取一个 Result,将其添加到 ResultPair,然后在评估之前找出结果和值。乍一看,由于构建器模式,继承不起作用,我想不出一种方法来获得 Result 允许的清晰、干净的代码,而无需完全复制 Result 类。

理想情况下,该方法将允许 Result 可选地返回一个值,但我想不出一种以类型安全的方式执行此操作的方法,以确保方法签名清楚地指示值的类型,但避免无意义的到处都是泛型参数我不返回值。

我真的不介意有两个类,复制结果生成器和评估代码并不是世界末日,只是感觉不对而且我觉得缺乏经验我更好,我错过了一个(明显或不那么明显的)解决方案。我正在使用 Guava,我想以一种友好的方式禁止空值,因此可以另外将所有值包装在一个 Optional 中,但我仍然需要通用参数(并将其组合到类中以避免 result.value( ).get()... 好的,我现在正在大声思考。我应该问一个问题...)。

是否有办法满足这些明显相互排斥的要求?

最佳答案

您可以创建自己的 ResultPair<T>作为 void 结果类的基类:

public class Result extends ResultPair<Void> { ... }

所有相关方法都将在 ResultPair<T> 中声明.

更新:

更好的是,只有一种类型 Result<T> ,并使用 Result<Void>每当您不想有返回值时。或者更确切地说,如果使用 Void由于类型参数对您来说看起来很奇怪,因此创建一个新的不可实例化(或单例)类型,意思是“没有结果”,并改用它:Result<Unit> ,例如。

关于java - 如何在不使用异常的情况下从方法返回失败详细信息并可选择包含一个值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8858656/

相关文章:

java - 如何正确获取网站的cookies?

java - 获取JInternalFrame右上角的按钮

java - 应用程序在菜单膨胀时崩溃。如何纠正?

java - Android 的 ARToolkit 演示无法正常工作

java - Java中的Kotlin泛型错误

java - 第 N 次组合 ({a, b} = {b, a}) 无重复(枚举/蛮力)

java - 如何继承一个RuntimeException类?

java - 如何解决 java.lang.NoClassDefFoundError?

java - 为什么不简单地禁用未经检查的警告?

java - Junit 在循环中处理预期异常