簡體   English   中英

使用varargs時出現意外行為-Java

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM