我正在与 API 进行通信,并且使用了 Optional
类。但我觉得错误处理可以更优雅,因此任何有关如何改进这一点的建议都会受到欢迎。我是否还缺少实际 api 调用中的异常处理?
public Optional<Account> getGreenqloudAccount(String accountUUid) {
System.out.println("tmplog: GreenqloudAccountDao->getGreenqloudAccount");
for (Account account : apiClient.accountList()) {
if (account.getUuid().equals(accountUUid)) {
System.out.println("getGreenqloudAccount, account: " + account.toString());
return Optional.of(account);
}
}
return Optional.empty();
}
public Optional<String> getMarketplaceCustomerIdByUsername(String username) {
if (username == null || username.equals("")) {
return Optional.empty();
}
AwsMarketplace marketplaceData = apiClient.getMarketplaceData(getKeys(username));
if (marketplaceData == null) {
return Optional.empty();
}
return Optional.ofNullable(marketplaceData.getObjects().get(0).getCustomerId());
}
private Pair getKeys(String username) {
GetKeys getKeys = apiClient.getKeys(username);
return new Pair(getKeys.getApiPrivateKey(), getKeys.getApiPublicKey());
}
最佳答案
代码的主要问题:您将大量非常不同的结果放入同一个“桶”中。
getMarketplaceCustomerIdByUsername()
例如,在以下情况下返回空可选:
- 用户名为空
- 用户名是“”(想想
“”
意味着空,但“”
不是空?!) - 找不到给定用户的
AwsMarketplace
实例
如前所述,这些是非常不同的问题。第一个可能表明:提供的用户名不正确,因此您应该告诉您的用户这一点。最后一个意思是:“有些可疑,可能用户未知,或者发生了其他事情”。
因此:考虑不要将不同的结果简化为空的Optional。而是考虑抛出(不同的?)异常。当“无结果”是操作的有效结果时,可以使用Optional。但“没有结果,因为用户名错误”感觉不是一个有效的结果。
关于Java api 返回可选,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58840839/