我正在与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.orElseThrow(Supplier<? extends X> exceptionSupplier)
阅读有关可选here的JDK8文档
另外,您可能需要在检查空字符串之前修剪输入参数
public Optional<Account> getGreenqloudAccount(String accountUUid) {
System.out.println("tmplog: GreenqloudAccountDao->getGreenqloudAccount");
return apiClient.accountList().stream()
.filter(account -> account.getUuId().equals(accountUUid))
.findFirst();
}
public Optional<String> getMarketplaceCustomerIdByUsername(String username) {
return Optional.ofNullable(username)
.filter(name -> !name.isEmpty())
.map(name -> apiClient.getMarketplaceData(getKeys(name)))
.map(marketplaceData -> marketplaceData.getObjects().get(0).getCustomerId());
}