就在最近,项目组开始强调开发规范了,今天分享一个变量名命名不规范的小案例,强调一下规范的重要性。

Boolean变量名命名规范

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

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

定义实体类

@Entity

publicclassBar{

@Id

@GeneratedValue

privateIntegerid;

privateBooleanisSuccess;// 注意这是错误的命名

privatebooleanisSend;// 注意这是错误的命名

publicBooleangetSuccess(){

returnisSuccess;

}

publicvoidsetSuccess(Booleansuccess){

isSuccess=success;

}

publicbooleanisSend(){

returnisSend;

}

publicvoidsetSend(booleansend){

isSend=send;

}

}

其中,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。

id

is_success

is_send

1

1

1

使用JdbcTemplate查询

publicvoidtest(Stringid){

RowMapperbarRowMapper=newBeanPropertyRowMapper(Bar.class);

Barbar=jdbcTemplate.queryForObject("select * from bar where id = ?",newObject[]{id},barRowMapper);

System.out.println(bar);

}

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

Bar{id=1,isSuccess=null,isSend=false}

数据库中是实际存在这样的字段,并且值都是true,而使用JdbcTemplate,却查询不到数据,而使用常规的命名方式命名则不会有这样的问题,这便是不遵循规范导致的问题。特别是在维护老旧代码时,如果发现有is开头的boolean值,需要额外地注意。

包装类型与原生类型

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

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

JavaBean规范

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

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

A:ebook

B:eBook

C:Ebook

D:EBook

.

.

.

.

正确答案是: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方法,需要解决上一段中提到的同样的问题,建议不确定的地方多测试,尽量采取稳妥的写法。

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

申请一个Java公众号怎么命名_警惕不规范的变量命名 - Java公众号_Kirito的技术分享的个人空间 - OSCHINA - 中文开源技术交流社区...相关推荐

  1. java中PL层_安装pljava - RuralHunter的个人空间 - OSCHINA - 中文开源技术交流社区

    pljava是pgsql跟java的桥接,安装以后就可以在pgsql里面调用java了.这里记录一下我在ubuntu server下安装的过程 1. 下载源码编译 很简单,下载,解压,设置一下JAVA ...

  2. java痴和堆_JAVA虚拟机理解 - 爱笑的痴迷者的个人空间 - OSCHINA - 中文开源技术交流社区...

    JVM定义: JVM(Java Virtual Machine),是一种运行Java程序的软件实现,是虚拟的机器.Java程序与平台无关,它直接在虚拟机中运行. JVM运行过程: JVM将内存分划如下 ...

  3. java空格转义_java转义字符 - simpower的个人空间 - OSCHINA - 中文开源技术交流社区...

    1. 注意regex的写法 String   newName=name.replaceFirst("d:\\\\racke\\\\","http://192.168.0. ...

  4. java进程老挂掉_JAVA进程突然挂掉 - 1024菜bird的个人空间 - OSCHINA - 中文开源技术交流社区...

    JVM内存不足导致进程死掉. Native memory allocation (mmap) failed to map 一台服务器上部署很多JAVA进程已经是微服务的常态,但也有些坑. 背景,测试服 ...

  5. java方法调用机制_Java方法调用机制 - osc_bkdv2it5的个人空间 - OSCHINA - 中文开源技术交流社区...

    最近在编程时,修改方法传入对象的对象引用,并没有将修改反映到调用方法中.奇怪为什么结果没有变化,原因是遗忘了Java对象引用和内存分配机制.本文介绍3个点: ① 该问题举例说明 ② 简要阐述Java内 ...

  6. java 0l是多少_Java 构造器 - osc_0ltyoebk的个人空间 - OSCHINA - 中文开源技术交流社区...

    Java 基础构造器 构造器: 构造对象. 1.构造方法的名字必须和类名字保持一致. 2.构造方法没有返回类型.(不是没有返回值!!!!!!!!!!!!!) 3.构造方法可以定义参数,也可以不定义,参 ...

  7. java回调函数的生命_Java的回调函数 - choaklin 的个人空间 - OSCHINA - 中文开源技术交流社区...

    暂且不提回调函数的各种定义,如我本人,虽然知道JavaScript的回调的使用,但是百科了回调的定义,还是觉得云里来雾里去.所以大可先从已熟悉的入手,旁推侧引它的原理,再引出Java版的实现. 因为博 ...

  8. java 羽化_JAVA10来了 - 羽化布凉的个人空间 - OSCHINA - 中文开源技术交流社区

    Java 9才发布几个月,很多玩意都没整明白,现在Java 10又要来了. 这时候我真想说:线上用的JDK 7,甚至JDK 6,而JDK 8 还没用熟,JDK 9 才发布不久不知道啥玩意,JDK 10 ...

  9. lua 区间比较_自然区间匹配算法 - borey的个人空间 - OSCHINA - 中文开源技术交流社区...

    什么是自然区间? 每一个单位都可以顺序访问的区间就称之为自然区间. 什么是自然区间匹配? 很多时候需要验证一个值,这个值的粒度很小或者说是异构的(从另外的模块获取的).配置这个值是否正确,我们通常会设 ...

最新文章

  1. Java 集合类图(转)
  2. C Runtime Library 的来历
  3. 分手后我还能和你做朋友么(转)
  4. CVPR 2021 速览 | 旷视研究院入选学术成果盘点
  5. net 架构师-数据库-sql server-003-T-SQL 基本语句
  6. 一文了解linux内核,一文了解Linux的系统结构
  7. 【PAT乙】1001 害死人不偿命的(3n+1)猜想 (15分) 模拟,水水更健康
  8. 微信小程序手机号快速填写及会员卡开卡组件开放
  9. java代表预设一个SQL_java-io基础-3-压缩和解压
  10. android studio 软件使用 详细说明
  11. 你需要了解的App经济学基础 转
  12. 高中计算机网络说课,高一信息技术说课稿
  13. 使用github搭建网站
  14. html5 canvas 一个漫天飞雪的效果
  15. 英媒:俄黑客靠窃密跻身“成功企业家” 被捕时昏迷
  16. 微软亚洲研究院成立20年,洪小文自述心路历程
  17. Linux /usr、/usr/share、/etc介绍
  18. Pandas数据类型——Series
  19. 微信Web APP应用
  20. 细说社交化经销商服务的十大典型应用场景

热门文章

  1. 自编码算法(SAE)
  2. Codeforces Round #658 (Div. 1) A2. Prefix Flip (Hard Version)
  3. 基于深度学习Autoencoder的信用卡欺诈异常检测算法
  4. 622. 设计循环队列(C实现)
  5. 漏洞无处不在 – iPhone4 越狱全过程(无需任何软件)
  6. Typora 页内跳转的语法
  7. HTTP 错误 500.19 - Internal Server Error 无法访问请求的页面,因为该页的相关配置数据无效——错误代码:0x8007000d
  8. hdu2612——Find a way
  9. python十六进制和十进制互转
  10. swoole创建多人多房间聊天室一