![](/img/trans.png)
[英]Java 3 dots parameter (varargs) behavior when passed no arguments or null
[英]Getting unexpected behavior when using varargs - java
我对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,是因为我们传递的参数不是行列式,可以没有参数,也可以有true / 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内,并将记录消息“ this is false”。
但是实际输出是它记录了“ this is true”和“ this is false”两者,而不是“外部true false”。
谁能帮助我成功达到预期的结果,并给我一些解释我做错了什么以及使用varargs?
你似乎想要
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) {
虽然时间更长,但可能更清楚,也可以减少混乱。
如果在没有任何参数的情况下调用该方法,则传入的数组的大小为零。 您尝试访问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) {
...
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.