一、 编程中的魔数

在阿里巴巴Java开发手册编程规约第二节常量定义的第一条中写道:

魔法值(即魔数)指的是未经预先定义的常量,而反例中的 “Id#taobao_” 则叫做魔字符串(Magic String)。这一规定在《Clean Code》和各大公司的代码规范手册中都有被提及过,那为什么这样规定呢?
《计算机程序的构造和解释》一书中表达过这种观点:

代码的第一要义是供人类理解,其次才是能正确地被机器执行。

没有一个程序猿愿意去读不带注释的代码,注释是一个好东西,但谁愿意为他代码中每一个常量后边加上注释?加得不累?我们看着累!公司里的一个项目基本都是多人合作,多组交接完成,谁也不希望在接手上一任的摊子前先要花几天去读明白他写的代码,因此,良好的代码规范,是每一位程序猿所必要的,用静态变量、枚举、宏定义等方法去避免代码中出现魔数,大大提高代码的可读性,让你的合作伙伴不再动不动就拿着你的小人扎你。

二 、文件中的魔数

文件中的魔数是为了确定文件的类型,许多格式的文件都有魔数,比如bmp中的“BM”、JPEG/JFIF中的“JFIF”,另外一些音频、视频格式的文件一样有魔数,Java也不例外。下面是一个简单的Java文件

public class MagicNumber {public static void main(String[] args) {System.out.println("Cafe Babe");}
}

在当前目录shift+鼠标右键打开 Power Shell,用javac编译该java文件,并在Emacs里按Alt+X输入hexl mode 以16进制模式打开class文件:

如图

  • 前四个字节cafebabe就是Class文件的魔数
  • 5、6字节为Class文件的次版本号
  • 7、8字节为Class文件的主版本号,0034,即十进制的52.0对应JDK 1.8.0

关于cafebabe ,Java的创始人之一,大佬James Gosling在他的博客里写道:

We used to go to lunch at a place called St Michael’s Alley. According to local legend, in the deep dark past, the Grateful Dead used to perform there before they made it big. It was a pretty funky place that was definitely a Grateful Dead Kinda Place. When Jerry died, they even put up a little Buddhist-esque shrine. When we used to go there, we referred to the place as Cafe Dead. Somewhere along the line it was noticed that this was a HEX number. I was re-vamping some file format code and needed a couple of magic numbers: one for the persistent object file, and one for classes. I used CAFEDEAD for the object file format, and in grepping for 4 character hex words that fit after “CAFE” (it seemed to be a good theme) I hit on BABE and decided to use it. At that time, it didn’t seem terribly important or destined to go anywhere but the trash-can of history. So CAFEBABE became the class file format, and CAFEDEAD was the persistent object format. But the persistent object facility went away, and along with it went the use of CAFEDEAD - it was eventually replaced by RMI. 0xCAFEBABE’s decimal number is 3405691582. If we add up all the bits we get 43. Exactly greater than 42-Ultimate Answer to the Life, the Universe, and Everything. The other 43 is also a prime number. You see, magic everywhere. Even in the last sentence.

部分翻译如下:
“我们常去一个叫St Michael’s Alley的地方吃午饭。根据当地的传说,很久以前有个叫Grateful Dead的乐队在成名前常在此演出…我们常去那里,我们把它称作Cafe Dead。我注意到这个名字是一串16进制数,当时我需要一对魔数去表示Class文件和Object文件(对象序列化的文件),我用CAFEDEAD表示object文件,然后把后两个字节替换掉,最后我决定用CAFEBABE表示Class文件…Object 文件被RMI(即远程方法调用)代替,CAFEDEAD也随之而去。0xCAFEBABE的十进制数是3405691582,把每一位加起来得到的是43,恰好大于42——生命、宇宙以及任何事情的终极答案(出自道格拉斯·亚当斯所作的小说《银河系漫游指南》)。另外,43也是个质数(玄学宇宙数论),你看,魔法无处不在,甚至在最后一句”

果然大佬们的脑回路就是不一样,而且这样看来,Java咖啡的命名从这里就有点苗头了。

Java冷知识之——魔数(Magic Number)相关推荐

  1. 文件头格式标准魔数-magic number和mime.types

    2021年11月8日10:13:39 1,magic number https://www.garykessler.net/library/file_sigs.html 这个文件头部,各种文件的默认数 ...

  2. [JAVA冷知识]JAVA居然支持多继承?让我们用内部类去实现吧

    写在前面 JAVA冷知识,今天和小伙伴分享的是 通过内部类的方式实现JAVA的多继承 一个Demo和JDK源码中的具体场景 部分内容参考 <编写高质量代码(改善Java程序的151个建议)> ...

  3. Java 中文件之魔数

    Java 中令人匪夷所思的 Magic 之魔数 先来讲讲一个故事,公司突然有一个需求,客户提交的文件,让你获取到他提交的文件到底是一个什么文件,这个不是小事一桩吗?直接上代码. public stat ...

  4. java的class文件魔数和版本对应关系

    使用十六进制编辑器打开class查看,CAFEBABE为class文件魔数,后面4个字节是版本号 也可以使用javap  -verbose yourclass.class查看major version

  5. java冷知识:代码行数多少才算大项目?

    注:以下摘自:<软件工程概论> 郑人杰.殷人民编 java项目的大小衡量标准(以代码行作为计量标准的): 微型:只是一个人,甚至是半日工作在几天内完成的软件: 小型:一个人半年内完成的 2 ...

  6. [JAVA冷知识]动态加载不适合数组类?那如何动态加载一个数组类?

    写在前面 今天和小伙伴分享一些java小知识点,主要围绕下面几点: 既然数组是一个类, 那么编译后类名是什么?类路径呢? 为什么说动态加载不适合数组? 那应该如何动态加载一个数组? 部分内容参考 &l ...

  7. Java冷知识(三)编译器的花招之synthetic修饰符

    首先我们应该达成一个共识:很多的Java语法糖都是编译器赋予的,而JVM是一个与Java语言解耦的平台.有了这个共识,再来看今天的主角:synthetic修饰符. 我们在阅读JDK反射包源码时,会遇到 ...

  8. JAVA 冷知识( break outer ;)

    如何在内循环结束外循环 关键字break和continue都是结束循环的作用,但是它只能结束它外面的第一层循环,如果代码里面是一层一层又一层的循环,你想直接结束最外层循环又该怎么做呢? 此时,就需要o ...

  9. 小知识 | Java中的“魔数”

    转载自 小知识 | Java中的"魔数" 在编程过程中,我们可能经常听到"魔数"这个词,那么这个词到底指的是什么呢?什么数叫做魔数呢? 一.标识文件类型的&qu ...

最新文章

  1. JavaScript学习笔记(三)——数组
  2. java学习(142):file类的基本创建
  3. 6. 同步化器(Synchronizers)
  4. mod_signalwire.c:1009 Next SignalWire adoption
  5. 【PID优化】基于matlab天牛须算法PID控制器优化设计【含Matlab源码 1312期】
  6. 保障系统迁移服务器搬迁,整体中心机房搬迁服务器idc数据迁移方案应用场景
  7. PR导入视频后无声音
  8. python海龟库函数大全_python海龟库的使用
  9. Stata:数据包络分析(DEA)
  10. 原生JS写一个首字母排序的通讯录效果
  11. 计算机图形学 构成立方体数据结构的简单表结构,计算机图形学-沈工大作业管理ppt课件...
  12. matlab信息隐藏图片,信息隐藏 实验二 BMP 图像信息隐藏
  13. 1.13正版服务器,我的世界Minecraft梦幻世界服务器(1.7-1.13版本)
  14. 做开发3年,字节跳动二面JVM底层被问得哑口无言
  15. 苹果ios9.2 html白屏,苹果游戏中心白屏怎么办 苹果游戏中心白屏解决方法【详解】...
  16. Latex调整表格行距
  17. #include ““和#include <>区别
  18. 土地生命周期管理-土地储备
  19. FPS 游戏自瞄原理
  20. 【附源码】计算机毕业设计JAVA医院临床管理系统录屏

热门文章

  1. 20221026使用搜狗翻译在线翻译英文文档的评测
  2. 百度下拉词用python怎么抓取
  3. Zabbix5.0网易邮箱163告警详细步骤
  4. 首届“攀升玩创嘉年华”端午江城噶事!
  5. 真假4K视频内容评价之我见
  6. 浙江大学计算机研究生2020年录取分数线,2020年浙江大学考研分数线公布
  7. dell服务器系统密钥和coa,买戴尔1545的问一下,你们有没有coa标签
  8. 分享制作系统启动U盘的方法
  9. 绝对的内幕!近些年各大IT公司售前薪水
  10. 记一次惨痛的拆机记录