使用varargs时获得意外行为 - java

时间:2016-02-13 13:30:14

标签: java variadic-functions

我是java varargs的新手。我编写了一个java方法,根据以下场景返回当前会话。

返回会话的方法

===========================

private HttpSession getSession(boolean... status) {
    if (status[0]) {
        log.info("this is true");
        session = servletRequest.getSession(true);
        return session;
    } else if (!status[0]) {
        log.info("this is false");
        session = servletRequest.getSession(false);
        return session;
    }
    log.info("outer part true false");
    session = servletRequest.getSession();
    return session;
}

我期待的场景

======================

1)当调用此方法为getSession()时,我们无法发送任何参数 - 如果存在则返回当前会话,否则将创建新会话

2)我们可以发送true作为getSession(true) - 与getSession()相同

3)我们可以将false作为getSession(false)发送 - 如果会话存在则返回会话,否则不应创建新会话

我选择了varargs,因为我们传递的参数不是决定因素,没有参数或者可以有真/假。

我在公共方法中调用了这个私有方法,如下所示。

public static void jsFunction_invalidate(Context cx, Scriptable thisObj, Object[] args, Function funObj)
        throws ScriptException {
    String functionName = "invalidate";
    int argsCount = args.length;
    if (argsCount != 0) {
        HostObjectUtil.invalidNumberOfArgs(hostObjectName, functionName, argsCount, false);
    }
    SessionHostObject sho = (SessionHostObject) thisObj;
    sho.getSession(false).invalidate();

}

所以预期的行为就是当我们调用这个getSession(false)时,它应该进入esle if条件并记录消息"这是假的#34;。

但实际输出是记录两者"这是真的"并且"这是假的"但不是"外部部分是真假"。

任何人都可以帮助我取得预期的结果并给我一些解释我做错了什么和使用varargs?

2 个答案:

答案 0 :(得分:2)

您似乎想要

boolean flag = status.length == 0 || status[0];
log.info("this is "  + flag);
session = servletRequest.getSession(flag);
return session;

然而,以这种方式写它可能更简单

private HttpSession getSession() {
    return getSession(true);
}

private HttpSession getSession(boolean status) {

虽然时间越长,但可能更清晰,更少混乱。

答案 1 :(得分:1)

如果在没有任何参数的情况下调用该方法,则传入的数组的大小为零。您尝试访问if语句中的第一个索引,但由于该数组没有大小,因此将抛出IndexOutOfBoundsException。您应该通过以下方式在方法中考虑到这一点:

if (status.length > 0 && status[0]) {
    log.info("this is true");
    session = servletRequest.getSession(true);
    return session;
} else if (status.length > 0 && !status[0]) {
    log.info("this is false");
    session = servletRequest.getSession(false);
    return session;
}

使用var-args似乎有点过于复杂,使用重载方法存在更好的变体:

private HttpSession getSession() {
    return getSession(true);
}

private HttpSession getSession(boolean status) {
    ...
}