Java 一次性执行 if 和 else 的代码块

HYF Lv3

总所周知,在普通的 if-else 结构中,if 和 else 分支是互斥的,只会执行其中一个分支。那么如果我们希望 if 和 else 里的代码块同时执行呢?(这确定不是闲的吗??)

需求

1
2
3
4
5
6
7
8
9
10
/**
* 在 main方法中的 if() 中填入条件,使得方法同时执行 if 分支以及 else 分支的代码块
*/
public static void main(String[] args) {
if () {
System.out.println("youfeng");
} else {
System.out.println("有风来");
}
}

解决

嘶…这个需求?删掉 if 和 else 留下各自的代码块不就好了,开码!!!

1
2
3
4
5
6
7
/**
* 同时执行 if 分支以及 else 分支的代码块
*/
public static void main(String[] args) {
System.out.println("youfeng");
System.out.println("有风来");
}

需求完美被解决,本文完(bushi)。

咳咳~ 不开玩笑了,接下来开始真正解决这个需求

1
2
3
4
5
6
7
8
9
10
11
12
13
/**
* @author -侑枫
* @date 2023/8/21 14:08:51
*/
public class SimultaneousOutput {
public static void main(String[] args) {
if (args == null || new SimultaneousOutput() {{ SimultaneousOutput.main(null); }}.equals("侑枫")) {
System.out.println("youfeng");
} else {
System.out.println("有风来");
}
}
}

这一堆乱七八糟的什么东西啊
我们直接来看执行结果:
SimultaneousOutput 执行结果
完美实现需求(这次是真的),那么他是如何实现这个需求的呢?

原理解释

仔细观察源代码,我们可以发现使用到了一个匿名类、初始化块以及递归调用。怎么样,是不是想到了什么?其实原理很简单,巧妙地利用了实例初始化代码块的执行优先级和递归调用自身来实现我们的需求。
我们再来仔细看一下源代码,从源代码执行开始逐句分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**
* @author -侑枫
* @date 2023/8/21 14:08:51
*/
public class SimultaneousOutput {
public static void main(String[] args) {
if (args == null || new SimultaneousOutput() {{
SimultaneousOutput.main(null);
}}.equals("侑枫")) {
System.out.println("youfeng");
} else {
System.out.println("有风来");
}
}
}
  • 在程序进入 main 方法后,首先遇到 if 语句,开始对条件进行判断。

  • 我们知道,在不传值时,args 默认为[],并不等于 null。所以左条件不成立,此时进入右判断分支。

  • 在右条件中创建了一个匿名类的实例,使用了实例初始化块递归调用了自身的 main 方法并给 args 赋了一个 null 值。

  • 接下来进入被调用的 main 方法中,此刻的 args 已被赋了一个 null 值,固 if 的左判断条件成立。根据 短路或 的执行规则,右判断不会被执行,所以不会再继续往下递归调用自身。而因为递归方法中 if 分支的左条件为 成立,输出 “youfeng”。递归方法的 main 方法到此执行完毕,回到递归上层。

  • 此刻的匿名类实例已执行完毕,而匿名类的实例放在此处为字符串,并不能作为一个布尔值来进行逻辑运算,所以引入与字符串 “侑枫” 对比。

  • 字符串 “侑枫” 的引用地址与匿名类的引用地址不同,比较结果为 false。而在开始进入 main 方法时,已经判断 args[] ,不等于 null,左右条件皆为 false。因此 if 分支的判断结果为false,输出 “有风来”,程序执行完毕。

需求实现,该需求更多的还是考验对 Java 基础的理解和逻辑能力的变通。当然,如果不限定在 if() 中填入条件,而可以在其他地方填入,这个需求则会更加简单:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
* @author -侑枫
* @date 2023/8/21 14:08:51
*/
public class SimultaneousOutput {
public static void main(String[] args) {
if (args == null) {
System.out.println("youfeng");
} else {
SimultaneousOutput.main(null);
System.out.println("有风来");
}
}
}

甚至如果不限定在 在 main 方法中的 if() 中填入,我们将方法体封装为一个方法:

1
2
3
4
5
6
7
8
9
10
11
public static void main(String[] args) {
outPut("风否?");
}
public static void outPut(String youfeng) {
if (Objects.equals(youfeng, "侑枫")) {
System.out.println("youfeng");
} else {
outPut("侑枫");
System.out.println("有风来");
}
}

不过既然选择了判断语句的if-else 又要求两分支全部都执行,提出这个需求的人点没猫饼吧?哈哈哈哈哈哈哈哈哈哈
看到这里的小伙伴再回到最开始的需求,是不是感觉豁然开朗了许多呢?


最后附上本文所写源代码:if-else分支同时输出

  • 标题: Java 一次性执行 if 和 else 的代码块
  • 作者: HYF
  • 创建于 : 2023-08-21 19:36:32
  • 更新于 : 2024-07-27 21:21:51
  • 链接: https://youfeng.ink/if-else OutPut-a477ab791ce2/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
此页目录
Java 一次性执行 if 和 else 的代码块