栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

阿里巴巴Java开发手册中一些疑问点的理解。

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

阿里巴巴Java开发手册中一些疑问点的理解。

1.【强制】避免通过一个类的对象引用访问此类的静态变量或静态方法,无谓增加编译器解析
成本,直接用类名来访问即可。

理解:当使用某个类的静态方法是,即便是该类的对象使用,也要用类.静态方法/变量的方式拿到,而不是对象.静态方法/变量。

  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;
   }
  1. 【强制】Object 的 equals 方法容易抛空指针异常,应使用常量或确定有值的对象来调用
    equals。
    正例:“test”.equals(object);
    反例:object.equals(“test”);
    说明:推荐使用 java.util.Objects#equals(JDK7 引入的工具类)。

理解:此处要牢记,之前使用过。自己判断一定有值的变量要在equals前,不确定的在后,如果都能判断,传入的参数在前比较好。

  1. 【强制】所有整型包装类对象之间值的比较,全部使用 equals 方法比较。
    说明:对于 Integer var = ? 在-128 至 127 范围内的赋值,Integer 对象是在 IntegerCache.cache 产生,会复用已有对象,这个区间内的 Integer 值可以直接使用==进行判断,但是这个区间之外的所有数据,都会在堆上产生,并不会复用已有对象,这是一个大坑,推荐使用 equals 方法进行判断。

理解:整型包装类,普通的基本整型应该不涉及,可以用==来比较

  1. 【强制】浮点数之间的等值判断,基本数据类型不能用==来比较,包装数据类型不能用equals 来判断

理解:浮点数的等值判断要小心再小心。。。不过已经知道了以后会有些意识的。

  1. 【强制】定义 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

  1. 【推荐】使用索引访问用 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(“.|@|$”),这样会以这三个符号作为或的形式分隔。(出现任意一个其中字符就进行一次分隔)

  1. 【推荐】循环体内,字符串的连接方式,使用 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 接口类的类使用这个方法都要判断。写的可能不规范但是是那个意思。
(九)其他

  1. 【强制】在使用正则表达式时,利用好其预编译功能,可以有效加快正则匹配速度。
    说明:不要在方法体内定义: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


  1. ↩︎

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/328289.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号