Java的括号使用规则_Java开发手册规范总结

本文总结了《阿里巴巴Java开发手册》中的关键点,包括ArrayList的subList注意事项、iBATIS的分页查询建议、Long类型初始化、Map与Set的key重写规则、equals与hashCode方法的使用、POJO类的命名与设计、toString方法的重要性、线程安全类的使用以及代码规范等,旨在提高代码质量和避免常见问题。
摘要由CSDN通过智能技术生成

Java开发手册规范总结

近期阿里推出了《阿里巴巴Java开发手册》正式版。在安装idea的代码监测插件后,本人打算逐条阅读开发规范中的内容,并做了下面的笔记,可能大部分内容是文档中的内容加上自己的理解。用于在日后的开发中更正自己的代码习惯,提高自己的代码质量。

ArrayList的subList结果不可强转成ArrayList

强转事会抛出异常

使用Listlist2 = new ArrayList(list.subList(0, 1));

subList返回的是ArrayList中定义的SubList,而不是ArrayList

iBATIS自带的queryForList(String statementName,int start,int size)不推荐使用

使用自己设计的分页查询

long或者Long初始赋值时,使用大写的L,而不是小写的l,小写容易跟数字1混淆,造成误解。

Long l = 0L;//Long l = 0l;

Map/Set的key为自定义对象时,必须重写hashCode和equals。

Map和Set的插入时通过key的hashCode和equals判断插入对象是否已经存在Map或者Set中。

重写hashCode和equals后可以排除将相同属性的不同对象插入到Map或者Set中。

Object的equals方法容易抛空指针异常,应使用常量或确定有值的对象来调用equals。

String inner = "hi";

if(inner.equals(str)){//str.equals(inner)

System.out.println("hello world");

}

如果str是null使用注释上的那种写法就会抛出NullPointerException

POJO类中的任何布尔类型的变量,都不要加is,否则部分框架解析会引起序列化错误

由于未指出具体的框架这边分析下POJO的概念

PO:persistant object 持久对象,可以看成是与数据库中的表相映射的java对象。最简单的PO就是对应数据库中某个表中的一条记录,多个记录可以用PO的集合。PO中应该不包含任何对数据库的操作。

VO:value object值对象。通常用于业务层之间的数据传递,和PO一样也是仅仅包含数据而已。但应是抽象出的业务对象,可以和表对应,也可以不对应。

DAO:data access object 数据访问对象,此对象用于访问数据库。通常和PO结合使用,DAO中包含了各种数据库的操作方法。通过它的方法,结合PO对数据库进行相关的操作。

BO:business object 业务对象,封装业务逻辑的java对象,通过调用DAO方法,结合PO,VO进行业务操作。

POJO:plain ordinary java object 简单无规则java对象,也就是一般的用来存储数据的java类。

POJO类必须写toString方法

重写toString在程序出现问题时打印对象属性值,便于快速定位问题

如果继承了另一个POJO类,注意在前面加一下super.toString。

SimpleDateFormat 是线程不安全的类,一般不要定义为static变量,如果定义为static,必须加锁,或者使用DateUtils工具类。

说明:如果是JDK8的应用,可以使用instant代替Date,LocalDateTime代替Calendar,DateTimeFormatter代替SimpleDateFormat,官方给出的解释:simple beautiful strong immutable thread-safe。

不允许任何魔法值(即未经定义的常量)直接出现在代码中

暂时不知道原因,可能是为了代码的可读性。

如果知道原因的欢迎留言告知

不能使用过时的类或方法。

java.net.URLDecoder 中的方法decode(String encodeStr) 这个方法已经过时,应该使用双参数decode(String source, String encode)。

接口提供方既然明确是过时接口,那么有义务同时提供新的接口;作为调用方来说,有义务去考证过时方法的新实现是什么。

过时的类或者方法可能会在将来的环境存在隐患,比如说时间戳超时32位int所能表示的最大值等。

不能在finally块中使用return,finally块中的return返回后方法结束执行,不会再执行try块中的return语句。

finally块中的代码无论如何都会执行。当finally中存在return语句时,函数的返回值一定是finally块中return语句。所以try块中的return语句不会被执行。

不要在foreach循环里进行元素的remove/add操作,remove元素请使用Iterator方式

在foreach循环中通过遍历集合类中的元素去循环执行,如果这个时候使用remove或者add操作,改变了集合类中的元素,所以会抛出异常

使用Iterator方式去循环集合类时,通过迭代器,调用next获取下一节点的数据是线程安全的、

中括号是数组类型的一部分,数组定义如下:String[] args

定义数组的规范

事务场景中,抛出异常被catch后,如果需要回滚,一定要手动回滚事务。

抛出异常被catch后方法将不抛出异常,所以就不会进行事务的回滚,所以需要回滚的情况下要手动回滚

使用工具类Arrays.asList()把数组转换成集合时,不能使用其修改集合相关的方法,它的add/remove/clear方法会抛出UnsupportedOperationException异常。

刚看到的时候想不通为什么都已经转成List为什么不能调用add等方法。

后来阅读了Arrays.asList()的源码后发现返回的是一个自己定义的ArrayList(不知道为什么也叫ArrayList),继承了AbstractList,但是没有重写add方法。所以抛出了异常。

使用集合转数组的方法,必须使用集合的toArray(T[] array),传入的是类型完全一样的数组,大小就是list.size()

toArray有两个重载方法toArray()和toArray(T[] array)。

toArray()返回的是Object[],不能强转成想要的数据类型,要转化的话需要遍历去转化。

toArray(T[] array)会返回和入参一样类型的数组,所以用这种方法更加合适。

关于基本数据类型与包装数据类型的使用标准如下:

1) 所有的POJO类属性必须使用包装数据类型。

2) RPC方法的返回值和参数必须使用包装数据类型。

3) 所有的局部变量推荐使用基本数据类型。

包装类是对象,拥有方法和字段,对象的调用都是通过引用对象的地址,基本类型不是

包装类型是引用的传递,基本类型是值的传递

声明方式不同,基本数据类型不需要new关键字,而包装类型需要new在堆内存中进行new来分配内存空间

存储位置不同,基本数据类型直接将值保存在值栈中,而包装类型是把对象放在堆中,然后通过对象的引用来调用他们

初始值不同,eg: int的初始值为 0 、 boolean的初始值为false 而包装类型的初始值为null

使用方式不同,基本数据类型直接赋值使用就好 ,而包装类型是在集合如 coolection Map时会使用

包名统一使用小写,点分隔符之间有且仅有一个自然语义的英语单词。包名统一使用单数形式,但是类名如果有复数含义,类名可以使用复数形式

一个自然语义的英语单词增强代码的可读性

包名统一使用小写区分首字母大写的类名

及时清理不再使用的代码段或配置信息。

减少代码的冗余量

增强代码可读性

后台输送给页面的变量必须加感叹号,${var}——中间加感叹号!。

加感叹号防止变量为空时打印变量名,加感叹号后如果变量为空则不显示

在if/else/for/while/do语句中必须使用大括号,即使只有一行代码

增强代码可读性

在subList场景中,高度注意对原列表的修改,会导致子列表的遍历、增加、删除均产生ConcurrentModificationException异常。

subList返回的是ArrayList中定义的SubList,而不是ArrayList

对原列表的修改时,由于子列表不会改变,会造成异常。

文本内容属于本人学习过程中的笔记记录,如有错误欢迎指出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值