java开发规范(个人理解)

java开发规范(个人理解)

今天看到一句话,非常有感触,大概的意思就是:代码不仅仅是给机器运行的,同样是给工程师去阅读的,请对每一行代码负责。后来想想自己写代码是否对每一行代码都负责,并且相当当接手别人的可读性非常差的代码心里的感受,所以决定写一篇博客来总结自己在java开发中学习到的规范以及技巧,该博客长期更新。

一,命名的风格

1,类名使用驼峰的形式命名,且第一个字母大写,如:UserServie,UserDao,类的命名同时也要使人便于理解,如使用了设计模式,应当在名字中体现,如:BeanFactory

2,方法名必须也是驼峰的形式,但是第一个字母小写 ,如:deletePersonById()

3,代码中的常量(1、0)等考虑是否定义final类型的常量定义方便理解,如使用常量定义,则必须全部大写、且用下划线连接,如:UPLOAD_SUCCESS_STATE = 0,UPLOAD_FAIL_STATE = -1;

二、技巧

1,使用equals方法时,可以使用确定的值调用equals,可以防止空指针异常。例如:“test”.equals(obj)来代替obj.equals(“test”)

2,if嵌套的层数应当尽量减少,在方法中,可以思考如下的方式

public void test(){

    if(false) return;

    if(false) return;

}

代替如下的写法,减少嵌套层数

public void test(){

    if(true){

        if(true){

            if(true){

                …

           }

        }

    }

}

3,循环内,如果有字符串连接,应当使用StringBuilder和StringBuffer代替str+=“test”防止内存的浪费。

4,能够使用局部变量的应当使用布局变量,而不是使用大量的全部变量

5,只要重写equals方法,必须重写hasecode,因为HashSet集合中判断不重复,是根据hashCode和equals判断的,所以set存储的对象必须同时重写hashCode和equals两个方法。HashMp的键值也是同样的。

6,不能在foreach循环中对元素进行add和remove操作,应当使用Iterator,否则会抛异常ConcurrentModificationException,这个我以前在前面的博客(https://blog.csdn.net/hongtaolong/article/details/83216973)中详细解释过,如果是多线程,需要对Iterator进行加锁

7,集合初始化中,因尽量初始化集合的大小,比如;Map map = new HashMap(10);可以一定程度提高性能,因为随着元素的增加,容器被迫扩大,导致重新新建hash表,影响性能。

8,使用entrySet编辑Map集合key和value,而不是使用keySet或者valueSet,因为keySet其实遍历了两次,第一次是转为Iterator对象,第二次是从hashmap中取出key对应的value。但是entrySet一次就能将key和value都放到entry中。

9,如果if(。。。)中的条件判断比较复杂,尽量将它里面的内容提取出来一个boolean类型的变量,提高程序的可读性。如if((a==b&& !list.isEmpty())|| c.isExist()) 可以变成如下方式boolean isExist = (a==b&& !list.isEmpty())|| c.isExist();

10,当打印日志时需要获取时间差等,获取时间的毫秒数可以使用System.currentTimeMillis()代替new Date().getTime();

11,当返回值为int类型的方法时,切勿在方法中返回Integer,因为这样当返回为null是,自动拆箱时会报NPE,这个问题我在写mybatis的mapper接口中的返回值遇到过。

12,这一条接上面一条,pojo的基本类型属性必须使用其包装类,比如id为int类型,应当定义为Integer id和不是int id 为什么会这样,请看11条,因为数据库操作可能返回null,拆箱是报NPE。

13,在使用long类型的变量时初始化时应当使用L而不是l,因为l和1容易混淆,导致程序出现问题,而且不容易找出。

14,能使用类名直接调用静态方法,如果使用对象的话,会存在一些解析的成本,当出现大量的这种情况时,也是一笔不小的开销。

15,相同的基本类型的包装类,尽量使用equals比较而不是使用==,这个地方很容易埋下大坑,比如Integer a 和Integer b比较时,如果Integer的值在-128—127之间是从IntegerCache.cache中生成的,在这个范围内比较用==没问题,但是当超过这个范围的话,就是在比较内存地址了,这个时候就不一定相等了。

 

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/111236.html原文链接:https://javaforall.net

(0)
上一篇 2021年8月2日 下午10:00
下一篇 2021年8月3日 上午8:00


相关推荐

  • Python学习(一)-环境搭建之PyCharm专业版激活成功教程

    Python学习(一)-环境搭建之PyCharm专业版激活成功教程PyCharm专业版激活成功教程1、下载地址:https://www.jetbrains.com/pycharm/download/#section=windows2、直接运行下载好的3、选择安装路径:E:\Pycharm\PyCharm2018.2.44、根据电脑配置打钩5、Install安装,安装后不打开软件6、将C:\Windows\System32\dri…

    2022年8月27日
    6
  • (转)C# Assembly.Load 使用

    (转)C# Assembly.Load 使用在C#中,我们要使用反射,首先要搞清楚以下命名空间中几个类的关系:在C#中,我们要使用反射,首先要搞清楚以下命名空间中几个类的关系:System.Reflection命名空间(1)AppDoma

    2022年7月1日
    21
  • java jettison_java – 使用Jettison进行JSON解析 – 堆栈内存溢出

    java jettison_java – 使用Jettison进行JSON解析 – 堆栈内存溢出如果您最终正在寻找使用 JAXB JSR 222 实现与 JSON 交互的方法 那么以下是使用 MOXy 完成它的方法 Jettison 是一个有趣的库 但是你会遇到一些问题 演示仅使用标准 JavaSEAPI 需要在 Unmarshaller 上设置两个 MOXy 特定属性 eclipselink media type 指定 application json eclipselink json

    2026年3月18日
    2
  • 麦克风阵列声源定位实现[通俗易懂]

    麦克风阵列声源定位实现[通俗易懂]麥克風陣列音源定位系統是利用麥克風陣列接收音訊,然後經由適當的演算法估算出音源入射麥克風陣列的方向角,即判斷出音源的位置方向。本專題著重於此演算法的程式撰寫,並實際測試二維及三維空間中單一音源入射的方向角,期望於演算速度及準確度上能有最好的效果。此系統完成後可搭配攝影機應用於視訊會議,隨時定位出發言者;也可應用於監視系統、玩具等。

    2025年12月11日
    3
  • pstack命令_压缩命令 linux

    pstack命令_压缩命令 linuxpstack命令可显示每个进程的栈跟踪。pstack命令必须由相应进程的属主或root运行。可以使用pstack来确定进程挂起的位置。此命令允许使用的唯一选项是要检查的进程的PID。pstree以树结构显示进程pstree-proot|grepphp-fpmroot为工作用户,-p为显示进程识别码,ps-Lf父进程号pstackPID号 转载…

    2025年11月15日
    6
  • 编写测试用例及一个例子

    编写测试用例及一个例子一.概念1.什么是测试用例?在测试过程中很重要的一类文档,它是测试工作的核心、是一组在测试时输入输出的标准、是软件需求的具体对照。2.测试用例的作用:检验软件是否满足客户需求、体现一个测试人员的工作量、展现测试用例的设计思路3.测试用例所包含的内容:用例编号、用例名称、测试背景、前置条件、优先级、重要级、测试数据、测试步骤、预期结果、实际结果、备注。4.测试用例的编写流…

    2022年7月17日
    12

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号