我在Java中有两个几乎相同的方法。唯一的区别是它们有不同的参数类型。它们使用泛型并返回输入参数的类型T。我怎样才能摆脱重复的代码?下面是我的两个方法。最后,它们都使用不同的类型调用Springresttemplate.exchange()
。否则,方法是相同的。
public <T> T send(Class<T> expectedClass) throws KenectRestClientException {
if (this.logRequest) log.info("Making request: " + this.toString());
HttpEntity<Object> entity = new HttpEntity<>(this.body, getTokenHeaders(this.token));
RestTemplate restTemplate = new RestTemplate();
String compiledUrl = UrlUtils.replacePathParamsInUrl(this.url, this.pathParams, this.uriEncode) + UrlUtils.compileRequestParamsToUrl(this.requestParams, this.uriEncode);
Object[] incompatibleStrings = extractIncompatibleStrings(compiledUrl);
try {
return restTemplate.exchange(compiledUrl, this.httpMethod, entity, expectedClass, incompatibleStrings).getBody();
} catch(RestClientResponseException e) {
log.warning(RestClientResponseException.class.getSimpleName() +
" url: " + url +
" status code: " + e.getRawStatusCode() +
" error body: " + e.getResponseBodyAsString() +
" stacktrace: " + ExceptionUtils.getStackTrace(e));
throw new KenectRestClientException("Failed to send request");
} catch(ResourceAccessException e) {
log.warning("Resource access exception " +
" url: " + url +
" stacktrace: " + ExceptionUtils.getStackTrace(e));
throw new KenectRestClientException("Failed to send request");
}
}
public <T> T send(ParameterizedTypeReference<T> parameterizedTypeReference) throws KenectRestClientException {
if (this.logRequest) log.info("Making request: " + this.toString());
HttpEntity<Object> entity = new HttpEntity<>(this.body, getTokenHeaders(this.token));
RestTemplate restTemplate = new RestTemplate();
String compiledUrl = UrlUtils.replacePathParamsInUrl(this.url, this.pathParams, this.uriEncode) + UrlUtils.compileRequestParamsToUrl(this.requestParams, this.uriEncode);
Object[] incompatibleStrings = extractIncompatibleStrings(compiledUrl);
try {
return restTemplate.exchange(compiledUrl, this.httpMethod, entity, parameterizedTypeReference, incompatibleStrings).getBody();
} catch(RestClientResponseException e) {
log.warning(RestClientResponseException.class.getSimpleName() +
" url: " + url +
" status code: " + e.getRawStatusCode() +
" error body: " + e.getResponseBodyAsString() +
" stacktrace: " + ExceptionUtils.getStackTrace(e));
throw new KenectRestClientException("Failed to send request");
} catch(ResourceAccessException e) {
log.warning("Resource access exception " +
" url: " + url +
" stacktrace: " + ExceptionUtils.getStackTrace(e));
throw new KenectRestClientException("Failed to send request");
}
}
如何传递一个布尔标志,根据该标志调用exchange()
传递类
或parameterizedtypereference
?
public <T> T send(T neededType, boolean flag) throws KenectRestClientException {
if (this.logRequest) log.info("Making request: " + this.toString());
HttpEntity<Object> entity = new HttpEntity<>(this.body, getTokenHeaders(this.token));
RestTemplate restTemplate = new RestTemplate();
String compiledUrl = UrlUtils.replacePathParamsInUrl(this.url, this.pathParams, this.uriEncode) + UrlUtils.compileRequestParamsToUrl(this.requestParams, this.uriEncode);
Object[] incompatibleStrings = extractIncompatibleStrings(compiledUrl);
try {
if (flag) {
return restTemplate.exchange(compiledUrl, this.httpMethod, entity, neededType.getClass(), incompatibleStrings).getBody();
} else {
return restTemplate.exchange(compiledUrl, this.httpMethod, entity, ParameterizedTypeReference.forType(neededType.getClass()), incompatibleStrings).getBody();
}
} catch(RestClientResponseException e) {
log.warning(RestClientResponseException.class.getSimpleName() +
" url: " + url +
" status code: " + e.getRawStatusCode() +
" error body: " + e.getResponseBodyAsString() +
" stacktrace: " + ExceptionUtils.getStackTrace(e));
throw new KenectRestClientException("Failed to send request");
} catch(ResourceAccessException e) {
log.warning("Resource access exception " +
" url: " + url +
" stacktrace: " + ExceptionUtils.getStackTrace(e));
throw new KenectRestClientException("Failed to send request");
}
}
问题内容: 我正在写一个方法,该方法应接受不共享除父对象以外的父类型的两种类型之一的对象作为其参数。例如,类型为Dreams和Garlic。您可以同时和。我想有一个方法,可以将Dreams和Garlic都接受为其参数。 Garlic和dreams都是某些库的一部分,因此让它们实现ICrushable接口(以便我可以编写)是不可行的。 我的方法主体很长,因此重载将意味着复制代码。丑陋。我确定我可以使
我的两个方法中的操作是相同的,但是输入参数类型不同,那么我该如何优化这两个方法,似乎没有那么重复?因为它们的操作是相同的,但参数类型不同,我该怎么做才能使这段代码更优雅呢?
我想这样设置参数的类型: 当我尝试这样做时,会引发错误:NameError:名称'Tree'未定义
问题内容: 我已经看到了一些类似的问题两种不同的类型如何使用接口在golang中实现相同的方法?,但就我而言,我的类型没有相同的基本类型。我的类型是不同大小的数组。 因此,可能不重复两种方法GetByte0()? 问题答案: 例如, 输出:
我使用一个Android库,它要求我创建两个类,每个类继承自不同的类 (具有公共基类) 现在我有这个代码: 我必须复制这个类来创建一个扩展,即使我的两个类共享完全相同的代码。 我简化了示例的代码,但重复可能很重要 我决定将代码放在这两个类之外的静态方法中,并在类重写的方法中调用它们,但我认为必须有一种更干净的方法来做到这一点。 你能帮我解决这个问题吗? 和都继承自。
因此,我正在创建一个用户API,并尝试在登录前调用getUserByEmail()。我的问题是,我得到了一个不明确的处理程序方法映射为HTTP路径错误。 我知道我的问题与我有一个相同但参数类型不同的GET有关。任何帮助都将不胜感激!