用于类似方法的参数中的Java可选参数

时间:2016-11-16 08:57:37

标签: java methods arguments

在下面的两个方法中,我想提取常用方法,我遇到的问题是其中一个方法中的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()));
    }

5 个答案:

答案 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

有几种方法可以处理可选参数,请参阅此答案。

Java optional parameters

答案 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容器视为参数?