当前位置: 首页 > 面试题库 >

Java:消除死代码

蒋阳华
2023-03-14
问题内容

我想知道Java如何处理以下情况:

假设我有一个名为Debug的类,它看起来像这样:

public class Debug 
{
    private static final boolean isAssertEnabled = true;

    public static void assertTrue(boolean b, String errorMessage) {
        if (isAssertEnabled) {
            if (!b) {
                throw new RuntimeException(errorMessage);
            }
        }
    }
}

并假设我的代码有一个看起来像这样的调用:

...
Debug.assertTrue((x + y != z) && (v - u > w), "Some error message");
....

我有几个问题:

  1. 如果 isAssertEnabled 标志设置为 false ,是否将整个对Debug.assertTrue的调用编译出来?请注意,仅在调用函数后才检查isAssertEnabled == true。
  2. 如果整个调用确实被编译出来了,是否也意味着布尔表达式的求值被编译出来了?毫无价值地评估该表达将是浪费。

感谢您的帮助!


问题答案:

布尔表达式的求值 不应 编译掉-至少由javac编译。

即使 当前Debug该类文件不使用该值,在执行时还是会这样吗? __

在使Debug类编译(通过使isAssertEnabled静态)后,javac仍然包含代码-
但我希望JIT编译器将其删除(尽管您应该看到Peter引用的问题)。我不确定是否可以将该方法内联为零。同样,如果JIT编译器可以做到这一点,并且 如果
意识到对参数进行评估不会有任何副作用,则它有可能避免评估。不过,我不会亲自编写代码。



 类似资料:
  • 本文向大家介绍java实现死锁的示例代码,包括了java实现死锁的示例代码的使用技巧和注意事项,需要的朋友参考一下 什么是死锁 我们先看看这样一个生活中的例子:在一条河上有一座桥,桥面较窄,只能容纳一辆汽车通过,无法让两辆汽车并行。如果有两辆汽车A和B分别由桥的两端驶上该桥,则对于A车来说,它走过桥面左面的一段路(即占有了桥的一部分资源),要想过桥还须等待B车让出右边的桥面,此时A车不能前进;对于

  • 问题内容: 我正在通过oracle文档进行死锁..我找到了这段代码 我不明白,在什么情况下会发生死锁? 我运行此代码,它工作正常。因此必须有一些特殊事件,何时会发生死锁? 假设首先在对象上调用bow ,那么当在bower对象上调用bow时,它会在对象上保持锁定吗?因为如果它保留其锁定,则另一个对象上的函数只有保持其锁定状态才能获得锁定,并且永远不会出现死锁情况。 问题答案: 如果在打印第一行之后并

  • 问题内容: 我有很多实现此接口的枚举: 一个典型的例子是: 可以想象,这些方法在CodableEnum的所有实现中实际上是相同的。我想消除这种重复,但坦率地说不知道如何做。我尝试使用如下类: 但这实际上是没有用的,因为: 枚举不能扩展类 枚举的元素(SKYPE,GOOGLE_TALK等)无法扩展类 我无法提供getByCode()的默认实现,因为DefaultCodableEnum本身不是枚举。我

  • 编译器提供了 dead_code(死代码,无效代码) lint,这会对未使用的函数产生警告。可以加上属性来抑制这个 lint。 fn used_function() {} // `#[allow(dead_code)]` 属性可以抑制 `dead_code` lint #[allow(dead_code)] fn unused_function() {} fn noisy_unused_funct

  • 我有一个Kafka主题T。 用户可以选择创建新条目A、B、C或删除它们。在创建每个条目A、B或C时;我将为kafka主题T创建一个同名的消费者组。 在删除条目A、B、C时;我想删除相应的消费者群体,而不会以任何方式影响主题T——但我想从Java模块中实现这一点。这怎么可能呢?

  • 我们已经实现了延迟消息处理,有2个队列和x-死信-交换/x-消息-ttl,在queue1中的消息超时后,它将转到queue2。 现在是否有可能设置RabbitMQ,以便如果在处理来自queue2的消息时,我们将其拒绝为“死信”,那么它将自动转到queue3?我担心的是queue2中的消息已经标记为“已死”,有没有办法区分那些因为被拒绝而死的消息,并自动只将那些放在队列3中?