簡體   English   中英

這是java最佳實踐嗎?

[英]Is it a java best practice?

我正在閱讀XposedBridge的源代碼。

我在閱讀以下代碼時感到困惑

do {
    label65: {
        try {
            ((XC_MethodHook)callbacksSnapshot[beforeIdx]).beforeHookedMethod(param);
        } catch (Throwable var18) {
            log(var18);
            param.setResult((Object)null);
            param.returnEarly = false;
            break label65;
        }

        if(param.returnEarly) {
            ++beforeIdx;
            break;
        }
    }

} while(beforeIdx < callbacksLength);

據我所知,code break label65表示會跳出while區域,但是和label165區域是一樣的。 標簽lable165的作用是什么? 這是我不知道的關於 Java 的最佳實踐。

這不被認為是好的做法。

看來,這段代碼被反編譯器產生的,我懷疑是標簽和break實際上是一個continue聲明,這完全正常的,如果你需要提前退出循環並回到起點。

它在 Java 中被認為是不好的做法,並且通常被認為類似於以創建意大利面條式代碼而臭名昭著的 GOTO 語句。

如果您需要在 Java 中使用帶標簽的 break 語句,通常意味着有更好的方法來構建邏輯/循環來避免它們。 我個人覺得它們令人困惑,尤其是當它們被濫用時。

但是,它們與 GOTO 語句的不同之處在於您只能跳轉到特定位置。 它們對於在特定條件下完全跳出嵌套循環非常有用。

它就像 GOTO 語句並起到遞歸調用的作用。 不過,這不是一個很好的做法。

據我所知,code break label65 表示會跳出while區域,但是和label165區域是一樣的。

實際上,它會中斷到標記語句的末尾。 如果您仔細查看括號,這意味着它在緊接在

    ++beforeIdx;

在循環結束時。

標簽label165的作用是什么?

看上面。

這是我不知道的關於 Java 的最佳實踐。

這不是最佳實踐。 此處使用標簽的方式使代碼難以理解,這是不好的做法。


事實上,如果這是手寫代碼,那么我懷疑它並沒有像作者認為的那樣做。 如果您查看帶有returnEarly標志的內容,它會在異常處理程序中設置,然后在try ... catch之后的語句中進行測試。 但是處理程序也會中斷到跳過if語句的標簽!

可能是故意的,但如果是這樣,那么它是一種非常晦澀/混淆的邏輯編碼方式。


@cryslis 寫道:

注意我的回答。 我認為這是一個反編譯的繼續。

我也懷疑是反編譯的代碼。 奇怪的本地名稱( label65var18 )是另一個線索。

但是,您說您在 Github 存儲庫中找到了源代碼。 這兩件事並不相互排斥……但如果有人反編譯代碼並將其上傳到 Github,那是非常不可靠的,而且可能是非法的。 我不想在沒有明確證據的情況下指指點點。 而且我在 repo 中找不到帶有label65var18的源代碼。

當然,反編譯代碼並將其上傳到 Github 並不是“最佳實踐”。

如果您正在獲取字節碼並試圖通過反編譯來理解它們,那么這也不是“最佳實踐”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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