Java中的条件编译

我最近在看《Java编程思想》,看到第六章的6.1.4小节【用import改变行为】时稍微有点迷惑。唉,英文不好看中文版就是这样,翻译后的有些文字很难看明白(╯﹏╰)。书中提到"通过修改被导入的package"来实现条件编译,于是,我就试了试,大概是下面这样:

首先,在debug包和realease包下分别有一个Cookie类,如下:

debug包内的Cookie:

package com.example.test.debug;

public class Cookie {

    public Cookie() {
        System.out.println("Debug Cookie.");
    }
}

 

realease包内的Cookie:

package com.example.test.realease;

public class Cookie {

    public Cookie() {
        System.out.println("Realease Cookie.");
    }
}

 

然后,在其他包中的Startup类中使用debug包内的Cookie:

package com.example.test;

import com.example.test.debug.*;

public class Startup {

    public static void main(String[] args) {
        Cookie cookie = new Cookie();
    }
}

运行结果如下:

Debug Cookie.

 

这样,只需要修改"import com.example.test.debug.*",将其改为"import com.example.test.realease.*"就可以使用realease包内的Cookie类了:

package com.example.test;

import com.example.test.realease.*;

public class Startup {

    public static void main(String[] args) {
        Cookie cookie = new Cookie();
    }
}

运行结果如下:

Realease Cookie.

 

我觉得书中就是想通过这种方式来进行条件编译,以实现代码的切换。但是,这样需要维护两套代码,不知道是不是大公司会这样做。其实,正常开发中我们使用日志的logger.isDebugEnabled()方法时就使用了条件编译。如下示例:

public class Test {

    public final static boolean isDebugEnabled = true;

    public static void main(String[] args) {
        if (isDebugEnabled) {
            System.out.println("print debug log...");
        }
    }
}

我们将其编译为class文件,再反编译如下:

public class Test {
    public static final boolean isDebugEnabled = true;

    public Test() {
    }

    public static void main(String[] var0) {
        System.out.println("print debug log...");
    }
}

然后,将isDebugEnabled改为false再编译为class,再反编译如下:

public class Test {
    public static final boolean isDebugEnabled = false;

    public Test() {
    }

    public static void main(String[] var0) {
    }
}

 

我们可以看到,在反编译的代码中没有了"System.out.println("print debug log...");"这条语句。这是因为isDebugEnabled的值为false,所以这个if判断里面的代码路径不会被执行,因此编译器自动进行了优化。

大概日志的logger.isDebugEnabled()的原理也是这样,感觉又学习到一些东西,这篇笔记到此为止吧(~^o^~)。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值