如何写出同事看不懂的Java代码?


原创:微信公众号 码农参上,欢迎分享,转载请保留出处。

哈喽大家好啊,我是没更新就是在家忙着带娃的Hydra。

前几天,正巧赶上组里代码review,一下午下来,感觉整个人都血压拉满了。五花八门的代码让我不禁感叹,代码规范这条道路还是任重而道远…

那么今天就来给大家总结一波Java中的代码作死小技巧,熟练掌握这些小技巧后,保证能让你写出同事看不懂的代码~

至于为啥要写出同事看不懂的代码,通过这次教训,我发现好处还是挺多的,简单举几个例子:

  • 同事无法轻易修改你的代码,避免团队协作不当引入bug
  • 塑造个人能力的不可替代性,规避被辞退的风险
  • 代码review时,帮助同事治疗好多年的低血压

好了,一本正经的胡说八道环节就此打住……废话不多说了,下面正式开始。没用的知识又要增加了…

壹、瞒天过海

要想写出别人看不懂的代码,很重要的一个小技巧就是把简单的东西复杂化。例如,判断一个int型数字的正负时明明可以写成这样:

public void judge(int x){
    if (x>0){
        //...
    }else if (x<0){
        //...
    }
}

但是我偏不,放着简单的代码不用,我就是玩,非要写成下面这样:

public void judge2(int x){
    if (x>>>31==0){
        //...
    }else if (x>>>31==1){
        //...
    }
}

怎么样,这么写的话是不是逼格一下子就支棱起来了!别人看到这多少得琢磨一会这块到底写了个啥玩意。

其实原理也很简单,这里用到的>>>是无符号右移操作。举个简单的例子,以-3为例,移位前先转化为它的补码:

11111111111111111111111111111101

无符号右移一位后变成下面的形式,这个数转化为十进制后是2147483646

01111111111111111111111111111110

所以,当一个int类型的数字在无符号右移31位后,其实在前面的31位高位全部是0,剩下的最低位是原来的符号位,因此可以用来判断数字的正负。

基于这个小知识,我们还能整出不少活来。例如,放着好好的0不用,我们可以通过下面的方式定义一个0:

int ZERO=Integer.MAX_VALUE>>31>>1;

通过上面的知识,相信大家可以轻易理解,因为在将一个数字无符号右移32位后,二进制的所有位上全部是0,所以最终会得到0。那么问题来了,我为什么不直接用Integer.MAX_VALUE>>32,一次性右移32位呢?

这是因为在对int型的数字进行移位操作时,会对操作符右边的参数进行模32的取余运算,因此如果直接写32的话,那么相当于什么都不做,得到的还是原数值。

叁、颠倒黑白

接下来要介绍的这个技巧就有点厉害了,可以将原有的一段串行逻辑改写成判断逻辑中的不同分支,并且保证最后能够正常执行。

在开始前先提一个问题,有没有一种方法,可以让ifelse中的语句都能执行,就像下面的这个例子中:

public static void judge(String param){
    if (/*判断条件*/){
        System.out.println("step one");
    }else {
        System.out.println("step two");
    }
}

如果我说只调用一次这个方法,就能同时输出ifelse中的打印语句,你肯定会说不可能,因为这违背了java中判断逻辑的基本常识。

没错,在限定了上面的修饰语只调用『一次』方法的条件下,谁都无法做到。但是如果在判断条件中动一点点手脚,就能够实现上面提到的功能。看一下改造后的代码:

public class IfTest {
    public static void main(String[] args) {
        judge("Hydra");
    }

    public static void judge(String param){
        if (param==null ||
                new IfTest(){{ IfTest.check(null); }}.equals("Hydra")){
            System.out.println("step one");
        }else {
            System.out.println("step two");
        }
    }
}

运行后控制台打印了:

step one
step two

惊不惊喜、意不意外?其实它能够执行的秘密就在if的判断条件中。

当第一次调用judge()方法时,不满不或运算中的第一个条件,因此执行第二个条件,会执行匿名内部类内的实例化初始块代码,再次执行judge()方法,此时满足if条件,因此执行第一句打印语句。

而实例化的新对象不满足后面的equals()方法中的条件,所以不满足if中的任意一个条件,因此会执行else中的语句,执行第二句打印语句。

这样就实现了表面上调用一次方法,同时执行ifelse中的语句块的功能。怎么样,用这种方式把一段整体的逻辑拆成两块,让你的同事迷惑去吧。

伍、釜底抽薪

好了,没用的知识介绍环节就此结束,相信大家在掌握了这些技巧后,都能自带代码混淆光环,写出不一样的拉轰代码。

最后建议大家,在项目中这样写代码的时候,搭配红花油、跌打损伤酒一起使用,可能效果更佳。

那么,这次的分享就到这里,我是Hydra,下篇文章再见。

作者简介,码农参上,一个热爱分享的公众号,有趣、深入、直接,与你聊聊技术。欢迎添加好友,进一步交流。

出处:https://www.cnblogs.com/trunks2008/p/16395499.html