我有以下界面
sealed interface Resource<out T> {
data class Success<T>(val data: T?) : Resource<T>
data class Error(val throwable: Throwable) : Resource<Nothing>
}
字符串
我在一个用例中这样使用它
suspend fun execute(fromLanguage: Language, fromText: String, toLanguage: Language): Resource<Any> {
return try {
val translatedText = translationClient.translate(...)
Resource.Success(translatedText)
}
catch (translationException: TranslationException) {
Resource.Error(translationException)
}
}
型
我在一个视图模型中使用这个结果
val result = translateUseCase.execute(...)
when(result) {
is Resource.Success -> {
result.data
}
is Resource.Error -> {
}
}
型
有几个令人困惑的事情是最好使用任何一个返回类型:
如果成功,用例确实返回一个String,所以这样会更好。
suspend fun execute(fromLanguage: Language, fromText: String, toLanguage: Language): Resource<String>
型
因为如果抛出异常,if可能返回错误,如果成功,则返回String,所以在这种情况下,Any会更好
suspend fun execute(fromLanguage: Language, fromText: String, toLanguage: Language): Resource<Any>
型
还是用星星投影更好
suspend fun execute(fromLanguage: Language, fromText: String, toLanguage: Language): Resource<*>
型
实现此响应接口的最佳方法是什么?
3条答案
按热度按时间ejk8hzay1#
老实说,我真的不明白为什么你甚至考虑不使用
Resource<String>
。如果我们的函数返回String
,但它也可能抛出异常,这并不意味着我们将其更改为返回Any
。在您的特定情况下,Resource<String>
意味着:“如果成功,则返回字符串值,否则返回异常”。它提供了有关潜在返回类型的完整而精确的信息。所以答案是:使用
Resource<String>
。vm0i2vca2#
Resource<String>
是最合理的返回类型。在这种情况下,如果成功,则类型String
是数据的类型。即使您有Error<String>
,它仍然包含比Error<Any>
更多的信息,因为它告诉您错误是专门请求String
的结果。如果返回类型为
Resource<Any>
,则会删除信息而不会获得任何好处。您将无法以String的形式检索成功的结果,但如果它是错误的,则不会影响您如何处理它。因此,在错误的情况下,这样做只有缺点而没有好处。由于
T
是out
,因此在这种情况下,Resource<*>
与Resource<Any>
相同。toe950273#
第一个月
你真的在错误时返回资源吗?你有在流的早期处理错误的要求吗?
看看你的用例,答案似乎是否定的。所以我想知道是否有一个默认的失败处理程序拦截器,抛出的异常传播到,而不是手动捕捉这些错误,将是一个更好的方法?
但是,如果需要以更结构化和可预测的方式处理这些错误,请查看Arrow's typed errors,因为这似乎是您试图实现的目标(即
Either<Fail, Success>
)