在编程中横行霸道[圣诞版]

反设计

万一把编程手段当成一种工具,无外乎语言、文档、框架,那几个都可以算作是工具的一有的。不要试图用锤子打开螺丝钉,尽管你真正可以做到。但那是反设计的。就好像这么些事例一样,你可以经过reflect改变final,但概括,那种技能并从未什么样用,它会给你带来诸多麻烦,比如在拓展时、在java版本升级时考虑包容性。

故此,在行使一种“工具”时,要尽可能根据工具创制者的怀想形式展开利用,所有那些所谓的“技巧”都是在反设计。


说到底,专注、严俊、逻辑清晰是一个程序员的质量,但在技巧迭代如此便捷的大背景下,在代码中追求极致是一个人类不可以成功的(要是用控制技术的来衡量的话,你永远不可以控制所有技能,并且,在技能迭代进程中,你本来精通的技术也在逐年淘汰。),别忘了你生活中的朋友、家人和你的欣赏。

过完圣诞就是新的一年,祝所有的程序员朋友圣诞欢娱(本文写于平安夜),同时在新的一年里打开程序员新的、不雷同的人生。

接口论

用作一个程序员,你是事情逻辑和代码完结的接口。没人在乎你怎么落到实处的作业,只在乎你的代码是或不是快速、准确、易用、易拓展(具体讲,比如有些ms再次回到结果,参数结构是还是不是不难,是还是不是不难添加新功效)。同理,你采纳Java作为你兑现业务逻辑的工具,你更可以选拔Python、Node.js、Kotlin甚至Linux
shell脚本,那么您是还是不是要领会Java语言的具备完成?正如本人在《如何变成10倍速的程序员》中所说的并非记得。

自己是在呼唤大家不求甚解吗?
是的。

一个简约的例子

那么些事例很悠久,早有长辈做过,但并不是负有的程序员都接触过。经常喜欢“猎奇”的程序员对此不会陌生。

import java.lang.reflect.Field;

public class ChangeFinalString {

    public static void main(String[] args) throws Exception {
        final String s = "12345: caiyongji";
        System.out.println(s);
        System.out.println("hashcode: " + s.hashCode());
        Field f = String.class.getDeclaredField("value");
        f.setAccessible(true);
        char[] value = (char[]) f.get(s);
        value[0] = (char) 20851;
        value[1] = (char) 27880;
        value[2] = (char) 20844;
        value[3] = (char) 20247;
        value[4] = (char) 21495;
        System.out.println(s);
        System.out.println("hashcode: " + s.hashCode());
    }
}

事例中,通过final早先化一个String,然后反射获取String类中名为value的Field,并再一次赋值value。执行后,你会发现String的hashcode值没有变,String的值却变了。其它,你还会意识这几行简单代码的彩蛋。

妇孺皆知,在Java中final
String中的值是逐步的。大家都驾驭String的+(拼接)运算会屏弃内存引用并在内存中重复开发地址,事实上也的确如此。但final的变量真的是不变的呢?谨以此文打开程序员思路,跳出定式思维,希望本文子禽给你的程序员生涯带来新的想想。

得出结论

看!是或不是觉得常规可以被打破,只要有丰富的技巧就可以在编程中横行霸道?也许有些严刻的程序员会提出hashcode方法的完结依靠于JVM,并不可能一向反映内存的情事。说实话,你仍旧不要求记住本文的例证,我只是想打破你本来的想想格局。

只是,上边的并不是自身想说的着实结论。

下面,才是“圣诞版”真正的意义。

莫不有点人会认为成绩斐然,我又通晓了一个面试题目标答案。没错,甚至像阿里、百度如此的境内巨头公司中,有局地面试官(注意是有一些),确实会问一些”final变量是不足变”那样的silly
question. 他们探究一门语言依旧领悟所有具体贯彻的细节,甚至语言的bug。
但换个角度,在如此钻研的同时,你是或不是考虑了你的时光费用、女对象以及后代?!

相关文章