在编程中为所欲为圣诞版

众所周知,在Java中final String中的值是一成不变的。大家都知道String的+(拼接)运算会丢弃内存引用并在内存中重新开拓地址,事实上也确实如此。但final的变量真的是一成不变的吗?谨以此文打开程序员思路,跳出定式思维,希望本文会给你的程序员生涯带来新的思考。

一个简单的例子

这个例子很久远,早有前辈做过,但并不是所有的程序员都接触过。通常喜欢“猎奇”的程序员对此不会陌生。

例子中,通过final初始化一个String,然后反射获取String类中名为value的Field,并重新赋值value。执行后,你会发现String的hashcode值没有变,String的值却变了。另外,你还会发现这几行简单代码的彩蛋。

得出结论

看!是不是觉得常规可以被打破,只要有足够的技巧就可以在编程中为所欲为?也许有些严谨的程序员会指出hashcode方法的实现依赖于JVM,并不能直接反映内存的情况。说实话,你甚至不需要记住本文的例子,我只是想打破你固有的思维模式。

然而,上面的并不是我想说的真正结论。

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

也许有些人会觉得收获颇丰,我又掌握了一个面试问题的答案。没错,甚至像阿里、百度这样的国内巨头企业中,有一些面试官(注意是有一些),确实会问一些"final变量是不可变"这样的silly question. 他们钻研一门语言甚至知道所有具体实现的细节,甚至语言的bug。 但换个角度,在如此钻研的同时,你是否考虑了你的时间成本、女朋友以及后代?!

接口论

作为一个程序员,你是业务逻辑和代码实现的接口。没人在乎你怎么实现的业务,只在乎你的代码是否高效、准确、易用、易拓展(具体讲,比如多少ms返回结果,参数结构是否简单,是否容易添加新功能)。同理,你使用Java作为你实现业务逻辑的工具,你更可以选择Python、Node.js、Kotlin甚至Linux shell脚本,那么你是否要理解Java语言的所有实现?正如我在《如何成为10倍速的程序员》中所说的不要记忆。

我是在号召大家不求甚解吗?

是的。

反设计

如果把编程手段当成一种工具,无外乎语言、文档、框架,这些都可以当成是工具的一部分。不要试图用锤子打开螺丝钉,虽然你确实可以做到。但这是反设计的。就像这个例子一样,你可以通过reflect改变final,但说白了,这种技巧并没有什么用,它会给你带来很多麻烦,比如在拓展时、在java版本升级时考虑兼容性。

所以,在使用一种“工具”时,要尽量按照工具制造者的思维模式进行使用,所有这些所谓的“技巧”都是在反设计。

最后,专注、严谨、逻辑清晰是一个程序员的品质,但在技术迭代如此迅速的大背景下,在代码中追求极致是一个人类无法做到的(如果用掌握技巧的来衡量的话,你永远无法掌握所有技巧,并且,在技术迭代过程中,你原本掌握的技巧也在逐步淘汰。),别忘了你生活中的朋友、家人和你的爱好。

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

本文来自企鹅号 - 全球大搜罗媒体

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏极限编程

解析简单设计原则

在 我的简单设计价值观 一文中,我分享了我在实践中形成对简单设计的理解。而提到价值观,平时跟同事讨论某个技术实践的时候,一旦触碰到价值观,我就会很谨慎,因为在两...

14160
来自专栏python+iOS学习交流

python入门 2018最新最全学习资料免费获取啦

是否非常想学好 Python,一方面被琐事纠缠,一直没能动手,另一方面,担心学习成本太高,心里默默敲着退堂鼓?

13320
来自专栏企鹅号快讯

C加加游戏编程永不过时的语言,原因何在?

想要知道C++到底如何你首先要了解C++的特性。C++既保留了C语言的有效性、灵活性、便于移植等全部精华和特点,又添加了面向对象编程的支持,具有强大的编程功能,...

39980
来自专栏奔跑的蛙牛技术博客

设计模式要点

8220
来自专栏牛客网

腾讯面经 一面

春招的简历被捞起来,接到电话都是懵逼的。。一上来先问面试官 不好意思咱们这是个啥部门啥职位啊,然后才是知道是c++研发...

12820
来自专栏IT大咖说

经过重重筛选,我们为什么要选择kotlin ?

内容来源:2017 年 11 月 19 日,上线了联合创始人郭达峰在“2017 谷歌开发者节北京站”上进行的《Kotlin as Your Next Langu...

36930
来自专栏CDA数据分析师

如何系统地自学 Python?

是否非常想学好 Python,一方面被琐事纠缠,一直没能动手,另一方面,担心学习成本太高,心里默默敲着退堂鼓? 幸运的是,Python 是一门初学者友好的编程语...

23770
来自专栏编程

学好C语言必须要掌握四个知识点

很多初学C语言的小伙伴,在学习之初并没有一个大概的概念,学习这门语言需要掌握多少知识点。 怎么才算学的差不多? C语言的精髓点在哪? 学到多少东西才能够达到做项...

266100
来自专栏程序员互动联盟

【答疑释惑第九讲】自学过程中如何才能抓住重点?

疑惑一 如何学好vim? 学习linux基本上第一关就是如何学习使用vim,vim其实就是个编辑器命令模式的编辑器,使得初学小白都觉得这工具很神秘,相对于越来越...

34250
来自专栏程序人生

代码重构之道

如果我纯粹为今天工作,明天我将完全无法工作。 -- 某子 程序员要面向未来编程。代码重构永远是程序员们无法回避的话题,当你的软件在编写的那一刻起,重构就不可避免...

39440

扫码关注云+社区

领取腾讯云代金券