【问题标题】:Getting unexpected behavior when using varargs - java使用可变参数时出现意外行为 - java
【发布时间】:2016-05-24 15:51:20
【问题描述】:

我对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) 发送 - 如果会话存在,它将返回会话,否则不应创建新会话

我选择可变参数是因为我们传递的参数不是行列式的,可以没有参数,也可以有真/假。

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

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 条件并记录消息“this is false”。

但实际输出是同时记录“这是真的”和“这是假的”,而不是“外部真假”。

谁能帮助我实现预期的结果并给我一些解释我做错了什么以及使用可变参数?

【问题讨论】:

  • 您确定您当前的代码在使用 getSession() 时可以运行吗?它应该抛出一个 ArrayIndexOutOfBounds 异常。如果您没有参数,您对 status[0] 的访问将无效。在这种情况下,我建议使用“函数重载”。
  • 是的,它抛出了你上面提到的异常

标签: java variadic-functions


【解决方案1】:

你似乎想要

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) {

虽然这更长,但它可能更清晰,更少混乱。

【讨论】:

    【解决方案2】:

    如果在没有任何参数的情况下调用该方法,则传入的数组的大小为零。您尝试访问 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) {
        ...
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-08
      • 2011-05-08
      • 1970-01-01
      • 2020-05-16
      • 1970-01-01
      相关资源
      最近更新 更多