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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 关于System.arraycopy方法的使用

    关于System.arraycopy方法的使用随时随地阅读更多技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666)在对数组进复制时,我们可以编写一个for循环实现,但是比较麻烦,我们可以使用System类的静态方法arraycopy()。arraycopy()方法的签名如下:publicstaticvoi…

    2022年10月26日
  • 阿里云服务器搭建私人云盘

    阿里云服务器搭建私人云盘1、配置安全组端口新建安全组并开放以下端口2、利用Git来搭建私人云盘1、利用Workbench点击立即登录进行远程连接2、安装docker容器docker是一款开源的容器运行工具,提供了一套便捷的服务打包、分发、部署方式。我们将要部署的服务就是通过docker容器来运行的。docker-compose是一款基于docker的容器编排工具。有了它,我们通过一份配置文件就能启动所有需要的服务。依次执行以下命令,通过自动化脚本完成docker..

    2022年5月23日
  • WebStorm常用快捷键(Mac版)

    WebStorm常用快捷键(Mac版)⌘——Command⌃——Control⌥——alt⇧——Shift⇪——CapsLockfn——功能键就是fn编辑Command+alt+T用(if..else,try..catch,for,etc.)包住Command+/注释/取消注释的行注释Command+alt+/注释/取消注释与块注释alt+↑向上选取代码块alt+↓向下选取代码块Command+alt+L格式化代码tab,shift+tab调整缩进Control+alt+I快

    2022年5月27日
  • 面试题:已知一个端口为22,如何查看端口对应的是什么服务名?

    面试题:已知一个端口为22,如何查看端口对应的是什么服务名?

    2022年3月5日
  • Win10+Ubuntu18.04双系统安装教程「建议收藏」

    Win10+Ubuntu18.04双系统安装教程「建议收藏」一.说在前头不同的配置安装方法不同,我也是小白第一次安,也是看了无数个教程不断重安了无数次才成功的,所以我的教程不一定适合你的配置,但你可以耐心的按照我的思路尝试,如果你有更好的想法,欢迎指出。我的配置如下:神舟笔记本,双硬盘(128固态+1t机械),bios模式为uefi(按Win+R打开运行,输入msinfo32,回车查看系统信息。在BIOS模式中如果显示“传统”,表示系统启动方式为…

    2022年7月24日
  • 公有云和私有云的区别 如何搭建云存储

    公有云和私有云的区别 如何搭建云存储云存储这样的隐喻或许感觉会有些夸张,但我们从中仍能感觉到和云相关的模糊的概念,对于这项技术的未来也是充满了未知,这对我们熟知的私有云存储也是一样。虽然市场上各种宣传的私有云存储都声称自己受益于在原有公有云上增加了防火墙,然而却有迹象表明私有云存储的名声却逐渐降到公共存储之下。说起公共存储,很难不与后网络公司时代的选择性外包联系起来,但尽管如此…

    2022年6月17日

发表回复

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

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