有没有办法转到方法的特定部分,而不是方法的开始?

Is there a way to go to a specific part of method, rather than start of method?

在Java8中,有些情况下我希望程序指向方法的特定部分而不是方法的开头,但是有没有办法做到这一点?

我知道,例如,我可以用我想重复的代码部分的副本创建一个循环,我也可以将该方法分成几个部分,例如:

public static void main(String[] args) 
 { //do stuff
  methodA();
 }
public static void methodA()
{
  //do more stuff
 methodB();
}
public static void methodB()
{  
//do some other stuff
if (answer == 1) methodA(); //return to methodA
else System.exit(0);
}

这是一个非常简单的示例(缺少明显的代码,但仅供参考)说明我是如何处理它的,但我希望能够在 main 和 reference 中插入某种标签像一个方法一样使用它,而不必将主要方法分解成块。

问题是:这可能吗?或者我可以采取其他方法吗?

另外:如果这在 Java 中不可用,但在某些其他语言中可用,对这种语言的引用将有助于我研究。

编辑: 澄清一下,我并不是专门在寻找 goto() 命令,因此请不要在您的回答中做出这样的假设。我也宁愿避免使用 goto() 命令,即使它可用,因为如果我在它上面添加代码,任何指向一行而不是方法的东西都会中断。我的想象更多是这样的:

public static void main(String[] args) 
 { //do stuff
  label bookmarkA();
   //do more stuff
   bookmarkA();
 }

如您所见,这是声明我稍后将跳转到的位置,然后像调用方法一样调用它。根据下面的答案,我怀疑这样的事情是否具体存在(尽管如果它确实存在我会很高兴),但似乎有一些命令可以在某些限制内在方法内向上或向下移动。

一个好的答案可能会告诉我什么是可能的,并且至少会为我指明正确使用它的方向。一个好的答案可能还会告诉我是否也有另一种语言的更接近我想要的东西。

最后,这不是要求 goto() 命令的问题的重复,因为那不是我真正想要的。

编辑 2: 如果关于这个问题的任何事情都不清楚,我不是在询问任何具体的方法来做我想做的事情,也不是我指定我想开始除了在我开始的方法的开头之外的任何地方执行一个方法。我具体地问,什么是可能的。请假设只有一种方法在使用,或者我想发生的一切都在同一种方法中。

正如我非常清楚地解释的那样,我已经知道如何用多种方法解决问题,但我想尽可能用相同的方法解决问题。

没有。 Java 不支持这个。您不能在方法内的任意点开始执行方法。考虑将您的方法分解成更小的方法来实现您的目标。

更新:

您实质上要求的是 goto 引用标签而不是行号,例如在 C 编程语言中:

The syntax for a goto statement in C is as follows:

goto label;
..
.
label: statement;

-- http://www.tutorialspoint.com/cprogramming/c_goto_statement.htm

但是,即使在支持它的 C 中,使用 goto 也被广泛认为是一种不好的做法。来自同一个 link:

NOTE: Use of goto statement is highly discouraged in any programming language because it makes difficult to trace the control flow of a program, making the program hard to understand and hard to modify. Any program that uses a goto can be rewritten so that it doesn't need the goto.

-- http://www.tutorialspoint.com/cprogramming/c_goto_statement.htm

或者,更著名的是 Edsger Dijkstra 的传奇 Go to considered harmful 论文。

Java不支持goto(虽然是保留字)。 java 中唯一支持的分支语句是 break, continue and return which are neatly summarized in the canonical java language tutorial.

汇编语言就是支持这种东西的语言。在汇编程序中,您可以调用 "functions" 或直接跳转到地址。

这是一个虚构的函数/方法示例:

00000000: mov eax, [ebx]    
00000004: mov [var], ebxvar
00000008: mov eax, [esi-4]
0000000A: mov [esi+eax], cl
0000000C: mov edx, [esi+4*ebx]    
...

在每一行你都可以看到代码所在的地址(':'之前的内容)

您可以选择 jmp 0jmp 000000A,这会让您获得完全不同的 "lines of code"。 但是这样做很脆弱,因为你很容易弄乱你的堆栈。

根据目前收到的评论,这在一定条件下是可行的。

1.) goto() 方法在 Java 中不起作用 8. 当然,无论如何这都不是解决问题的方法,因为如果有任何问题,指向特定的行可能会导致问题后来在上面添加了这样的参考。另一种想法似乎也不存在。

另一方面,java 中 goto() 的有限功能由 this approach 实现。

2.) 正如另一位指出的那样,该方法必须从头开始至少 运行 一次。当然,由于问题的重点是在不创建其他方法的情况下尝试解决问题,所以这应该不用说。该方法已经 运行ning 我只想在同一方法内向上移动。

3.) 可用的功能似乎仅限于 break, break , continue, continue 。虽然我还没有收到更多细节,但这似乎是尝试解决我的问题的好方向。

4.) 似乎也可以在 Java 中使用一些汇编。您显然可以通过 JNI 调用 C 代码并使用 C 代码调用程序集,如果绝对需要,这将允许 goto() 功能。由于汇编指令将保持独立,可能在它自己的 class 中,它不应导致意大利面条代码,并且会避免一些正常使用 goto() 的问题。

我提示其他人创建这样一个列出的答案,但没有人,所以我觉得有必要自己回答,以避免将错误信息传递给他人。但是,如果有人在接下来的几天内有更完整的答案,我会 select 他们的答案是最好的。

最好的方法是将您的方法分解为更小的方法。然后你可以调用你需要的部分而不需要任何卷积。