分享下自己在工作中用到的Java开发规则和功能实现及原理,共12个。

1、类的命名使用驼峰式命名的规范。

例如:UserService,但是以下情景例外:DO / BO / PO / DTO / VO。

例如说:UserPO,StudentPO(PO,VO,DTO,等这类名词需要全大写)

@Data
@Builder
public class CustomBodyDTO {

private String name;private String idCode;private String status;

}
2、如果在模块或者接口,类,方法中使用了设计模式,那么请在命名的时候体现出来。

例如说:TokenFactory,LoginProxy等。

public class TokenFactory {

public TokenDTO buildToken(LoginInfo loginInfo) {String token = UUID.randomUUID().toString();TokenDTO tokenDTO = TokenDTO.builder().token(token).createTime(LocalDateTime.now()).build();String redisKey = RedisKeyBuilder.buildTokenKey(token);redisService.setObject(redisKey, loginInfo, Timeout.ONE_DAY * 30 * 2);log.info("创建token成功|loginInfo={}", loginInfo.toString());return tokenDTO;
}

}
3、Object 的 equals 方法容易抛空指针异常。

从源码来进行分析equals方法是属于Object类的,如果调用方为null,那么自然在运行的时候会抛出空指针异常的情况。

object类中的源码:

public boolean equals(Object obj) {return (this == obj);
}

为了避免这种现况出现,在比对的时候尽量将常量或者有确定值的对象置前。

例如说:

正确:“test”.equals(object);
错误:object.equals(“test”);
4、对于所有相同类型的包装类进行比较的时候,都是用equal来进行操作。

对于Integer类来说,当相应的变量数值范围在-128到127之间的时候,该对象会被存储在IntegerCache.cache里面,因此会有对象复用的情况发生。

所以对于包装类进行比较的时候,最好统一使用equal方法。

private static class IntegerCache {static final int low = -128;static final int high;static final Integer cache[];static {// high value may be configured by propertyint h = 127;String integerCacheHighPropValue =sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");if (integerCacheHighPropValue != null) {try {int i = parseInt(integerCacheHighPropValue);i = Math.max(i, 127);// Maximum array size is Integer.MAX_VALUEh = Math.min(i, Integer.MAX_VALUE - (-low) -1);} catch( NumberFormatException nfe) {// If the property cannot be parsed into an int, ignore it.}}high = h;cache = new Integer[(high - low) + 1];int j = low;for(int k = 0; k < cache.length; k++)cache[k] = new Integer(j++);// range [-128, 127] must be interned (JLS7 5.1.7)assert IntegerCache.high >= 127;}private IntegerCache() {}
}

public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
5、所有的pojo类中的属性最好统一使用包装类属性类型数据。RPC方法的返回值和参数都统一使用包装类数据。局部变量中使用基本的数据类型。

对于实际的应用场景来说,例如说一个学生类,当我们设置里面的成绩字段为int类型的时候,如果学生没有考试,那么这个成绩字段应该为空,但是int默认会赋值为0,那么这个时候使用基本数据类型就容易产生误区,到底是考了0分,还是说没有参加考试。

如果换成使用包装类Integer类型的话,就可以通过null值来进行区分了。

6、当pojo类在进行编写的时候要重写相应的toString方法,如果该pojo中继承了另外的一个pojo类,那么请在相应的tostring函数中加入super.toString()方法。

通过重写toString方法有利于在日志输出的时候查看相应对象的属性内容进行逐一分析,对于一些有继承关系的对象而言,加入了super.toString方法更加有助于对该对象的理解和分析。

7、在pojo的getter和setter方法里面,不要增加业务逻辑的代码编写,这样会增加问题排查的难度。

正确做法:

public class User {
private Integer id;

private String username;public Integer getId() {return id;
}public User setId(Integer id) {this.id = id;return this;
}public String getUsername() {return username;
}public User setUsername(String username) {this.username = username;return this;
}

}
错误的做法:

public class User {
private Integer id;

private String username;public Integer getId() {return id;
}public User setId(Integer id) {this.id = id;return this;
}public String getUsername() {return "key-prefix-"+username;
}public User setUsername(String username) {this.username = "key-prefix-"+username;return this;
}

}
8、final 可以声明类、成员变量、方法、以及本地变量。

下列情况使用 final 关键字:

不允许被继承的类,如:String 类。

不允许修改引用的域对象,如:POJO 类的域变量。

不允许被重写的方法,如:POJO 类的 setter 方法。

不允许运行过程中重新赋值的局部变量。

避免上下文重复使用一个变量,使用 final 描述可以强制重新定义一个变量,方便更好地进行重构。

9、对于任何类而言,只要重写了equals就必须重写hashcode。

举例说明:

1)HashSet在存储数据的时候是存储不重复对象的,这些对象在进行判断的时候需要依赖hashcode和equals方法,因此需要重写。

2)在自定义对象作为key键时,需要重写hashcode和equals方法,例如说String类就比较适合用于做key来使用。

10、不要在 foreach 循环里进行元素的 remove/add 操作。

remove 元素请使用 Iterator方式,如果并发操作,需要对 Iterator 对象加锁。

Iterator iterator = list.iterator();
while (iterator.hasNext()) {
String item = iterator.next();
if (删除元素的条件) {
iterator.remove();
}
}
11、使用HashMap的时候,可以指定集合的初始化大小。

例如说,HashMap里面需要存放10000个元素,但是由于没有进行初始化大小操作,所以在添加元素的时候,hashmap的内部会一直在进行扩容操作,影响性能。

那么为了减少扩容操作,可以在初始化的时候将hashmap的大小设置为:已知需要存储的大小/负载因子(0.75)+1

HashMap hashMap=new HashMap<>(13334);
12、Map类集合中,K/V对于null类型存储的情况:

集合名称 key value 说明
HashMap 允许为null 允许为null 线程不安全
TreeMap 不允许为null 允许为null 线程不安全
HashTable 不允许为null 不允许为null 线程安全
ConcurrentHashMap 不允许为null 不允许为null 线程安全
13、可以利用 Set 元素唯一的特性,可以快速对一个集合进行去重操作,避免使用 List 的contains 方法进行遍历、对比、去重操作。

通关观察可以发现,HashSet底层通过将传入的值再传入到一个HashMap里面去进行操作,进入到HashMap里面之后,会先通过调用该对象的hashcode来判断是否有重复的值,如果有再进行equals判断,如果没有相同元素则插入处理。

public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
另外推荐一个最近刚看的学习资料,内容很系统,建议大家看一下:

JAVA开发规范 (<<<点击直接查看)

你可以有这样的提升:
(1)刚入行的小白可以更好地明白企业是如何进行项目开发,实现在企业干的长,干的住,提升技术能力和薪资能力。
(2)稍微有点工作经验的,会良好养成代码规范书写,深入了解原理深层次原理,改变未来职业道路中,走的更远,更强。
(3)像我这种的可以深入了解或者更加巩固框架整理优化,项目的首尾呼应,从全局观看待项目,拓展自己的眼光和增长自己的技术水平。

JAVA开发规范常用的技巧总结(共12个安全牛课堂)相关推荐

  1. 谈谈Google与微信H5牛牛的Java开发规范

    多年前,Google发布微信H5牛牛搭建平台(h5.fanshubbs.com)来定义Java编码时应遵循的微信牛牛Q_1687054422规范:今年年初阿里则发布阿里巴巴Java 开发手册,并随后迭 ...

  2. JAVA 开发规范标准(集合)

    JAVA 开发规范 一.编程规约 (一)命名规约 1. [强制] 代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符 号结束. 反例:_name / __name / $Object / ...

  3. 谈谈阿里与谷歌的Java开发规范

    无规矩不成方圆,编码规范就如同协议,有了Http.TCP等各种协议,计算机之间才能有效地通信,同样的,有了一致的编码规范,程序员之间才能有效地合作.道理大家都懂,可现实中的我们,经常一边吐槽别人的代码 ...

  4. 谈谈ali与Google的Java开发规范

    无规矩不成方圆,编码规范就如同协议,有了Http.TCP等各种协议,计算机之间才能有效地通信,同样的,有了一致的编码规范,程序员之间才能有效地合作.道理大家都懂,可现实中的我们,经常一边吐槽别人的代码 ...

  5. hualinux java 1.17:java开发规范(新手必看)

    有不少java初学者都不知道java开发规范的,所以网上找了一个国内电商算是权威的java开发手册 国内最大的电商就是淘宝了,我们向老大学习. 根据<阿里巴巴Java开发手册>中" ...

  6. Java开发规范之代码格式篇(上)

    在程序员的世界里有两件最讨厌的事情,第一件事情是讨厌写代码注释,第二件事情是讨厌看别人的代码不写注释.虽然这只是个段子,但也反映了当下很多程序员的心声.下面简单介绍下代码规范的重要性,第一,规范的代码 ...

  7. java object转list_这份Java开发规范,让你100%受益!

    今天跟大家分享下Java开发规范的知识. 基于阿里巴巴JAVA开发规范整理: https://github.com/alibaba/p3c 1 命名风格 [强制]类名使用 UpperCamelCase ...

  8. java 线程 john_教你Java开发中多线程同步技巧

    教你Java开发中多线程同步技巧 在编写一个类时,如果该类中的代码可能运行于多线程环境下,那么就要考虑同步的问题.在Java中内置了语言级的同步原语--synchronized,这也大大简化了Java ...

  9. Java开发中常用的设计模式-单例模式

    单例(Singleton)模式的定义:指一个类只有一个实例,且该类能自行创建这个实例的一种模式. Java开发中常用的设计模式-单例模式 单例模式有3个特点: 单例类只有一个实例对象: 该单例对象必须 ...

最新文章

  1. go语言的goconvey
  2. CSS3的弹性盒子flex详解(2)
  3. SQL重复记录查询的几种方法
  4. Batch_size问题
  5. linux perl 单例模式,Perl脚本学习经验(三)--Perl中ftp的使用
  6. 魔兽世界账号与服务器的关系,账号整合不用烦 《魔兽世界》角色转移问题一览...
  7. eclipse java 生成api_怎样使用Eclipse在Java中实现自己的API
  8. 我的云之旅--hadoop单机设置(2)
  9. centos mysql lujin_MySQL中文转换成拼音的函数[zt]
  10. qtp测试 java web_QTP之web常用对象
  11. 单片机课设———基于51单片机的智能风扇控制器(汇编语言)
  12. 查询使用计算机的处理器型号是,cpu型号怎么看,怎么看电脑cpu型号?
  13. memset和memset_s
  14. Windows系统自带工具介绍
  15. MOVICS系列教程(二) COMP Module
  16. Spring教程——Spring注入内部Bean
  17. 分布式事务--TX-LCN(介绍)
  18. Android 搜狗输入法-手表版对圆形手环/手表适配
  19. 深度理解抽象类和接口
  20. buuctf pwn wp(第四波)格式化字符串漏洞系列

热门文章

  1. OEA体验 :常用功能1
  2. 论文阅读笔记 Jointly Attentive Spatial-Temporal Pooling Networks for Video-based Person Re-Identification
  3. java时分秒字符串转时间,秒转化为天小时分秒字符串的java实现和js实现
  4. 需要3个积分下载小土豆注册机,不知道发一个博客可以获得积分不
  5. jsp服装商城购物系统
  6. 计算机处理器几位从那里看,[电脑怎么看几位]要怎么看电脑是几位的系统
  7. python 求导实现_如何使用Python求导
  8. hadoop-2.0.0-cdh4.1.2.tar.gzl安装配置
  9. 写一篇300字前端开发实习日报,以学习了vue为开头
  10. java学习记录16-反射