1.【强制】避免通过一个类的对象引用访问此类的静态变量或静态方法,无谓增加编译器解析
成本,直接用类名来访问即可。
理解:当使用某个类的静态方法是,即便是该类的对象使用,也要用类.静态方法/变量的方式拿到,而不是对象.静态方法/变量。
- 【强制】相同参数类型,相同业务含义,才可以使用 Java 的可变参数,避免使用 Object。
理解:我的感觉是又不好读,又不好分析,我要学着不用,我觉得list完全可以盖住这参数,只要把参数转成list就行。
具体使用见下:
public int sum(int a, int b, int c, int d){
int sum = a + b + c + d;
return sum;
}
public int sum(int... ints){
int sum = 0;
for (int number : ints) {
sum += number;
}
return sum;
}
- 【强制】Object 的 equals 方法容易抛空指针异常,应使用常量或确定有值的对象来调用
equals。
正例:“test”.equals(object);
反例:object.equals(“test”);
说明:推荐使用 java.util.Objects#equals(JDK7 引入的工具类)。
理解:此处要牢记,之前使用过。自己判断一定有值的变量要在equals前,不确定的在后,如果都能判断,传入的参数在前比较好。
- 【强制】所有整型包装类对象之间值的比较,全部使用 equals 方法比较。
说明:对于 Integer var = ? 在-128 至 127 范围内的赋值,Integer 对象是在 IntegerCache.cache 产生,会复用已有对象,这个区间内的 Integer 值可以直接使用==进行判断,但是这个区间之外的所有数据,都会在堆上产生,并不会复用已有对象,这是一个大坑,推荐使用 equals 方法进行判断。
理解:整型包装类,普通的基本整型应该不涉及,可以用==来比较
- 【强制】浮点数之间的等值判断,基本数据类型不能用==来比较,包装数据类型不能用equals 来判断
理解:浮点数的等值判断要小心再小心。。。不过已经知道了以后会有些意识的。
- 【强制】定义 DO/DTO/VO 等 POJO 类时,不要设定任何属性默认值。
反例:POJO 类的 createTime 默认值为 new Date(),但是这个属性在数据提取时并没有置入具体值,在更新其它字段时又附带更新了此字段,导致创建时间被修改成当前时间。
理解:private int number;public Data data;别写值,不要进行初始化,保持null,所有引用类型的不赋值情况下都是null。
相关内容:POJO(Plain Ordinary Java Object):简单对象,专指只有 setter / getter / toString 的简单类,即DO/DTO/BO等领域对象的统称。阿里开发手册规约禁止对象命名成xxxPOJO。
所有的 POJO 类属性必须使用包装数据类型(包装数据类型是指Long、Integer等包装数据类型,而不是基本数据类型long、int等基本数据类型)。
DO(Data Object):此对象与数据库表结构一一对应,通过 DAO 层向上传输数据源对象。xxxDO,xxx为数据表名。
DTO( Data Transfer Object):数据传输对象,Service 或 Manager 向外传输的对象。即指数据传输过程中需要用到的对象,如微服务之间需要封装传输的一些对象,或业务层跟持久层之间传输的对象,可以用xxxDTO,xxx 为业务领域相关的名称。
BO(Business Object):业务对象,由 Service 层输出的封装业务逻辑的对象。在业务逻辑实现过程中,一些DO领域对象的属性需要封装来使用的时候,可以封装成BO业务对象,笔者对BO业务对象理解还不是很深刻,在开发中也只是到DO和DTO而已,没严格地区分BO和DTO。
参考:java对象 POJO和JavaBean的区别?https://www.jianshu.com/p/224489dfdec8
- 【推荐】使用索引访问用 String 的 split 方法得到的数组时,需做最后一个分隔符后有无内容的检查,否则会有抛 IndexOutOfBoundsException 的风险。
说明:
String str = "a,b,c,,";
String[] ary = str.split(",");
// 预期大于 3,结果是 3
System.out.println(ary.length);
理解:1.当字符串是“a,b,d”,可以识别到4个,第三个是空的,但是当“a,b,”,split方法单个参数只能识别成两个值,所以在字符串未知的时候,首先检查分隔符是否存在,其次使用split(string,-1)的形式来防止最后一个值不存在时造成的数组越界之类的可能。
扩展:注意分隔符有十二个特定字符,需要(“|”)或者(“[|]”)来进行转义,这十二个字符为:.|*+1{}(别的没查到,反正常用的都在这了)
如果使用多个分隔符,则需要借助|符号:split(“.|@|$”),这样会以这三个符号作为或的形式分隔。(出现任意一个其中字符就进行一次分隔)
- 【推荐】循环体内,字符串的连接方式,使用 StringBuilder 的 append 方法进行扩展。
说明:下例中,反编译出的字节码文件显示每次循环都会 new 出一个 StringBuilder 对象,然后进行append 操作,最后通过 toString 方法返回 String 对象,造成内存资源浪费。
反例:
String str = "start";
for (int i = 0; i < 100; i++) {
str = str + "hello";
}
理解:肯定是一个快一个慢,反正就是循环体内如果有字符串拼接,就用str1.append(str2)的方式就行了。
有人试验过:http://www.manongjc.com/detail/12-wjfmjamlicsgjyv.html
24.(3) 类非 static 成员变量并且与子类共享,必须是 protected。
理解: protected定义的变量,子类可以直接进行变更,但是private的变量,子类访问不到,既不可读也不可写(在没有getset方法的时候)。
这一块都是意思要严格控制访问权限。
例:
public class TestFather {
private String nameString;
protected String name;
public TestFather(){
nameString = "流";
name = "水";
}
}
public class TestSun1 extends TestFather{……}
…………
TestSun1 aSun = new TestSun1();
aSun.name = "fen";
但是aSun不能直接修改nameString。
(五)集合处理
7. 【强制】在使用 Collection 接口任何实现类的 addAll()方法时,都要对输入的集合参数进行
NPE 判断。
NPE指的是空指针异常Null Pointer Exception
理解:if(array != null && !array.isEmpty()){ list.addAll(array); }
先判断非空,完了在里边执行方法,只要是实现了 Collection 接口类的类使用这个方法都要判断。写的可能不规范但是是那个意思。
(九)其他
- 【强制】在使用正则表达式时,利用好其预编译功能,可以有效加快正则匹配速度。
说明:不要在方法体内定义:Pattern pattern = Pattern.compile(“规则”);
理解:在外边写完了再在方法里用。
private static final Pattern pattern = Pattern.compile(regexRule);
private void func(...) {
Matcher m = pattern.matcher(content);
if (m.matches()) {
...
}
}
代码原文链接:https://blog.csdn.net/qq_20051535/article/details/113572624
↩︎



