这是一个java最佳实践吗?

时间:2015-07-05 04:56:38

标签: java

我正在阅读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);

据我所知,代码break label65表示它会突破while区域,但与label165区域相同。标签lable165的功能是什么?这是关于java的最佳实践,我不知道。

4 个答案:

答案 0 :(得分:2)

这不被视为良好做法。

看来这个代码是由反编译器生成的,我怀疑标签和break实际上是continue语句,如果你需要, 完全正常提前退出循环并返回到开头。

答案 1 :(得分:1)

它被认为是Java中的不良做法,并且通常被认为类似于因创建意大利面条代码而臭名昭着的GOTO语句。

如果您需要在Java中使用带标签的break语句,通常意味着有一种更好的方法来构造逻辑/循环以避免它们。我个人觉得它们很混乱,特别是当它们被滥用时。

但是,它们与GOTO语句不同,因为您只能跳转到特定位置。并且它们可以在特定条件下完全打破嵌套循环。

答案 2 :(得分:0)

它就像GOTO声明一样,起着反复呼唤的作用。虽然这不是一个很好的做法。

答案 3 :(得分:0)

  

据我所知,代码中断标签65表示它会突破while区域,但它与label165区域相同。

实际上,它会打破标签声明的末尾。如果仔细查看括号,这意味着它会在

之前立即中断
    ++beforeIdx;

在循环结束时。

  

标签lable165的功能是什么?

见上文。

  

这是关于java的最佳实践,我不知道。

这不是最佳做法。标签在这里使用的方式使代码难以理解,这是不好的做法。

事实上,如果这是手写代码,那么我怀疑它不会做作者认为它做的事情。如果你查看带有returnEarly标志的东西,它将在异常处理程序中设置,然后在try ... catch之后的语句中进行测试。但是处理程序也会破坏跳过if语句的标签!

可能是故意的,但如果是,那么这是一种非常模糊/混淆的编码逻辑的方式。

@cryslis写道:

  

请注意我的回答。我认为这是一个反编译的继续。

我还怀疑它是反编译的代码。奇怪的本地名称(label65var18)是另一条线索。

但是,你说你发现源代码是一个Github仓库。这两件事并不是互相排斥的...但是如果有人反编译代码并将其上传到Github,那就非常笨拙,而且可能是非法的。我不想在没有明确证据的情况下指出手指。我在回购邮件中找不到label65var18的源代码。

当然,反编译代码并将其上传到Github不是“最佳做法”。

如果您正在获取字节码并尝试通过反编译来理解它们,那么这也不是“最佳实践”。