在下面的两个方法中,我想提取常用方法,我遇到的问题是其中一个方法中的aisleID是可选的 - 是否可以在java方法中放置可选参数?
private void putPageUnderAisleId(String aisleId) {
given()
.spec(prepareApplicationJsonHeaders())
.header(HttpHeaders.AUTHORIZATION, verifiableToken(Roles.WRITE_MERCHANDISING))
.body(readResource(NAMED_PAGE_CONTENT_FILE, String.format("%s.html", TEST_PAGE.value()), AISLE_TEST_LOCATION))
.put(AISLE_HTML_URL, aisleId)
.then()
.statusCode(200)
.body(not(isEmptyOrNullString()))
.body(JSON_RESPONSE_MESSAGE, not(isEmptyOrNullString()));
}
private void putPageUnderRootAisleId() {
given()
.spec(prepareApplicationJsonHeaders())
.header(HttpHeaders.AUTHORIZATION, verifiableToken(Roles.WRITE_MERCHANDISING))
.body(readResource(NAMED_PAGE_CONTENT_FILE, String.format("%s.html", TEST_PAGE.value()), AISLE_TEST_LOCATION))
.put(ROOT_AISLE_HTML_URL)
.then()
.statusCode(200)
.body(not(isEmptyOrNullString()))
.body(JSON_RESPONSE_MESSAGE, not(isEmptyOrNullString()));
}
答案 0 :(得分:3)
使用Java 8 lambda表达式处理此问题可能有一种更简单的方法,但是您可以公开putPageUnderAisleId(String aisleId)
,当输入为null
时,您可以将其视为没有传递参数。像这样:
private void putPageUnderAisleId(String aisleId) {
RequestSpecification instance = given()
.spec(prepareApplicationJsonHeaders())
.header(HttpHeaders.AUTHORIZATION, verifiableToken(Roles.WRITE_MERCHANDISING))
.body(readResource(NAMED_PAGE_CONTENT_FILE, String.format("%s.html", TEST_PAGE.value()), AISLE_TEST_LOCATION));
if (aisleId != null) {
instance.put(AISLE_HTML_URL, aisleId)
} else {
instance.put(ROOT_AISLE_HTML_URL)
}
instance.then()
.statusCode(200)
.body(not(isEmptyOrNullString()))
.body(JSON_RESPONSE_MESSAGE, not(isEmptyOrNullString()));
}
答案 1 :(得分:2)
幸运的是,你不能用Java做到这一点。
您必须声明这两种方法,但您可以在[A-Za-z0-9_]
中仅调用\z
,并只处理空案例。
此讨论提供了有关您的问题的更多信息:Java optional parameters
答案 2 :(得分:1)
您可以尝试使用方法重载。假设php, Php, PHP
方法接受空值put
,您可以尝试以下操作。
aisleId
有几种方法可以处理可选参数,请参阅此答案。
答案 3 :(得分:1)
为什么不是这样的?
private void putPageUnderRootAisleId() {
return putPageUnderAisleId(null);
}
private void putPageUnderAisleId(String aisleId) {
Object putKey = aisleId != null ? AISLE_HTML_URL : ROOT_AISLE_HTML_URL;
given()
.spec(prepareApplicationJsonHeaders())
.header(HttpHeaders.AUTHORIZATION, verifiableToken(Roles.WRITE_MERCHANDISING))
.body(readResource(NAMED_PAGE_CONTENT_FILE, String.format("%s.html", TEST_PAGE.value()), AISLE_TEST_LOCATION))
.put(putKey, aisleId)
.then()
.statusCode(200)
.body(not(isEmptyOrNullString()))
.body(JSON_RESPONSE_MESSAGE, not(isEmptyOrNullString()));
}
这种方法的好处在于你只需要维护一种方法。我将putKey定义为Object,因为我不知道您使用的是哪个库。两个方法之间唯一不同的部分是put()部分。只需检查put方法实现。 99%确定带有1个参数的一个调用带有2的一个调用,第二个带有默认值。如果此默认参数为null,则表示您已准备好使用我的参数。如果它与null不同,那么你只需要像aisleId那样进行分配:
aisleId != null ? aisleId : %defaultValue;
在一个参数实现上%defaultValue方法放置的默认值。
正如@AxelH所指出的,如果put收到varargs,上面的方法是冒险的(可能不正确),所以在这种情况下你应该创建一个Object []来提供这些参数:
private void putPageUnderRootAisleId() {
return putPageUnderAisleId(null);
}
private void putPageUnderAisleId(String aisleId) {
Object putKey = aisleId != null ? AISLE_HTML_URL : ROOT_AISLE_HTML_URL;
Object[] putArgs = aisleId != null ? new Object[]{aisleId} : new Object[]{};
given()
.spec(prepareApplicationJsonHeaders())
.header(HttpHeaders.AUTHORIZATION, verifiableToken(Roles.WRITE_MERCHANDISING))
.body(readResource(NAMED_PAGE_CONTENT_FILE, String.format("%s.html", TEST_PAGE.value()), AISLE_TEST_LOCATION))
.put(putKey, putArgs)
.then()
.statusCode(200)
.body(not(isEmptyOrNullString()))
.body(JSON_RESPONSE_MESSAGE, not(isEmptyOrNullString()));
}
答案 4 :(得分:0)
您是否将Java 8的新Optional容器视为参数?