java变量命名规则_Java警惕不规范的变量命名

Boolean变量名命名规范

16年底,阿里公开了《Java开发规范手册》,其中有一条便是“布尔类型不能以is为前缀”。规范中没有举出例子,但是给出了原因:会导致部分序列化框架的无法解析。

看看错误的示范,会导致什么问题,以Spring中的jdbcTemplate来进行实验。

定义实体类

6ef24d99b92bfdac9cb24e2dbed8a144.png

其中,isSuccess使用的是包装类型Boolean,而isSend使用的是原生类型boolean,而getter,setter方法是使用Intellij IDEA自动生成的,布尔类型生成getter,setter方法时略微特殊,比如原生类型的getter方式是以is开头的,他们略微有点区别,注意区分。生成getter,setter方法之后,其实已经有点奇怪了,不急,继续下面的实验。

在数据库中,isSuccess被映射了is_success,isSend被映射成了is_send,这符合我们的预期。并且为了后续的实验,我们事先准备一条记录,用于后续的查询,在mysql的方言中,布尔类型被默认自动映射成byte,1代表ture,0代表false。

b027c5e86053189b04279687c712ff5c.png

使用JdbcTemplate查询

8e5f067b7760e6a8d84a386f2be0fca3.png

JdbcTemplate提供了BeanPropertyRowMapper完成数据库到实体类的映射,事先我重写了Bar类的toString方法,调用test(1)看看是否能成功映射。结果如下:

5567b8fc610849829cc4baf083aa6b3e.png

数据库中是实际存在这样的字段,并且值都是true,而使用JdbcTemplate,却查询不到这样的问题,这边是不遵循规范导致的问题。

相信这个例子可以让大家更加加深映像,特别是在维护老旧代码时,如果发现有is开头的boolean值,需要额外地注意。

包装类型与原生类型

在回顾一下上述的demo,原生类型和包装类型都没有封装成功,isSuccess得到了一个null值,isSend得到了一个false值。后者足够引起我们的警惕,如果说前者会引起一个NullPointerExcepiton导致程序异常,还可以引起开发者的注意,而后者很有可能一直作为一个隐藏的bug,不被人所察觉,因为boolean的默认值为false。

在类变量中,也普遍提倡使用包装类型,而原生类型的不足之处是很明显的。以Integer num;字段为例,num=null代表的含义是num字段未被保存,未定义;而num=0代表的含义是明确的,数量为0。原生类型的表达能力有限。所以提倡在局部作用域的计算中使用原生类型,而在类变量中使用包装类型。

JavaBean规范

如今的微服务的时代,都是在聊架构,聊容器编排,竟然还有人聊JavaBean,但既然说到了规范,顺带提下。

先来做个选择题,以下选项中符合JavaBean命名规范的有哪些?:

a436d1a201713e1e070ad24419faa2fd.png

正确答案是:A,D

怎么样,符合你的预想吗?JavaBean规范并不是像很多人想的那样,首字母小写,之后的每一个单词首字母大写这样的驼峰命名法。正确的命名规范应该是:要么前两个字母都是小写,要么前两个字母都是大写。因为英文单词中有URL,USA这样固定形式的大写词汇,所以才有了这样的规范。特别警惕B那种形式,一些诸如sNo,eBook,eMail,cId这样的命名,都是不规范的。

由此引申出了getter,setter命名的规范,除了第一节中Boolean类型的特例之外,网上还有不上文章,强调了这样的概念:eBook对应的getter,setter应当为geteBook(),seteBook(),即当类变量的首字母是小写,而第二个字母是大写时,生成的getter,setter应当是(get/set)+类变量名。但上面已经介绍过了,eBook这样的变量命名本身就是不规范的,在不规范的变量命名下强调规范的getter,setter命名,出发点就错了。有兴趣的朋友可以在eclipse,intellij idea中试试,这几种规范,不规范的变量命名,各自对应的getter,setter方法是如何的。另外需要知晓一点,IDE提供的自动生成getter,setter的机制,以及lombok这类框架的机制,都是由默认的设置,在与其他反射框架配合使用时,只有双方都遵循规范,才能够配合使用,而不能笃信框架。这一点上,有部分国产的框架做的并不是很好。

最后说一个和JavaBean相关的取值规范,在jsp的c标签,freemarker一类的模板语法,以及一些el表达式中,${student.name}并不是取的student的name字段,而是调用了student的getName方法,这也应当被注意,student.name如何找到对应的getter方法,需要解决上一段中提到的同样的问题,建议不确定的地方多测试,尽量采取稳妥的写法。

可能有人会觉得这样的介绍类似于“茴”字有几种写法,但笔者认为恰恰是这些小的规范,容易被人忽视,才更加需要被注意。

0618e8c29377ef44dba64734c42a1b3c.png
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值