就在最近,项目组开始强调开拓类型了,本日分享一个变量名定名不类型的小案例,强调一下类型的重要性。例子虽小,但却较量有开导意义。
Boolean变量名定名类型
16年底,阿里果真了《Java开拓类型手册》,个中有一条即是“布尔范例不能以is为前缀”。类型中没有举出例子,可是给出了原因:会导致部门序列化框架的无法理会。
看看错误的示范,会导致什么问题,以Spring中的jdbcTemplate来举办尝试。
界说实体类
@Entity public class Bar { @Id @GeneratedValue private Integer id; private Boolean isSuccess;// 留意这是错误的定名 private boolean isSend;// 留意这是错误的定名 public Boolean getSuccess() { return isSuccess; } public void setSuccess(Boolean success) { isSuccess = success; } public boolean isSend() { return isSend; } public void setSend(boolean send) { 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查询
public void test(String id) { RowMapper<Bar> barRowMapper = new BeanPropertyRowMapper<Bar>(Bar.class); Bar bar = jdbcTemplate.queryForObject("select * from bar where id = ?", new Object[]{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这类框架的机制,都是由默认的配置,在与其他反射框架共同利用时,只有两边都遵循类型,才气够共同利用,而不能笃信框架。这一点上,有部门国产的框架做的并不是很好。