繁体   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