[英]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 寫道:
注意我的回答。 我認為這是一個反編譯的繼續。
我也懷疑是反編譯的代碼。 奇怪的本地名稱( label65
和var18
)是另一個線索。
但是,您說您在 Github 存儲庫中找到了源代碼。 這兩件事並不相互排斥……但如果有人反編譯代碼並將其上傳到 Github,那是非常不可靠的,而且可能是非法的。 我不想在沒有明確證據的情況下指指點點。 而且我在 repo 中找不到帶有label65
和var18
的源代碼。
當然,反編譯代碼並將其上傳到 Github 並不是“最佳實踐”。
如果您正在獲取字節碼並試圖通過反編譯來理解它們,那么這也不是“最佳實踐”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.