2019-07-23 看阿里守则 OOP规约* 通配符

OOP规约

1.避免使用类对象调用静态方法,要用类名嘟点的方式调用

2.所有覆写的方法都要加@Override注解

3.最好不用可变参数这种方式去编程

4.不要使用过时的类和方法

5.外部正在调用或者二方库依赖的接口,不允许修改方法签名,避免对接口调用方产

生影响。接口过时必须加@Deprecated 注解,并清晰地说明采用的新接口或者新服务是什

么;没接触过

6.Object的equal方法尽量不要用,要用常量或者已知确定不会为空的数字嘟点然后调用equals方法;昨天遇到了这个问题;

7.所有整型包装类比较都要用equals方法 不要用==前面已经说过了记住两套 整型包装类用equals比较;在-128到127之间 可以==是true 超过这个范围就未必了。记住记住;7-15中 有具体解释

8.浮点数之间的等值判断,基本数据类型不用== ,包装类不用equals

推荐使用两种方式第一,可以设置一个极小值 当他们的比值小于这个数的时候就认为相等

第二种 我能理解的就是使用BigDecimal这个类 ,具体用到了再学吧

9.DO类对象的属性要和数据库中的属性相同;数据库中 的 bigint必须和类中的Long对应;

10.为了防止精度丢失禁止使用BigDecimal的构造方法将double传进去,最好是传入的参数类型为String;要不就BigDecimal bd = new BigDecimal(“1.22323”)或者

BigDecimal bd = BigDecimal.valueOf(1.232123)这个也可以,valueOf内部是toString方法,就是把double的后面的零截取了转换为一个String返回;

11.所有POJO类型和RPC类都需要使用包装数据类型,记住就行了,应为查询数据库的时候有可能返回null,如果使用基本数据类接收 就会出现NPE;

12.序列化类新增属性时,请不要修改 serialVersionUID 字段,避免反序列失败;如果

完全不兼容升级,避免反序列化混乱,那么请修改 serialVersionUID 值。不懂以后遇到再说

13.构造方法中不要加入业务逻辑,需要添加业务逻辑的时候定一个init()方法;

14.POJO 类必须写 toString 方法。使用 IDE 中的工具:source> generate toString时,如果继承了另一个 POJO 类,注意在前面加一下 super.toString。说明:在方法执行抛出异常时,可以直接调用 POJO 的 toString()方法打印其属性值,便于排查问题。

15.POJO类中不能同时有isxxx()和getxx()方法;

16.使用索引访问用 String 的 split 方法得到的数组时,需做最后一个分隔符后有无内

容的检查,否则会有抛 IndexOutOfBoundsException 的风险。

17.循环体内的字符串连接应该使用StringBuilder类的append方法进行拼接,如果用循环+的方式进行拼接,那么每次+的时候都会从内部产生一次StringBuilder,造成了内存的浪费

18.final 可以声明类、成员变量、方法、以及本地变量,下列情况使用 final 关键字:

他说可以也没说必须

1) 不允许被继承的类,如:String 类。//内部已经定好了干嘛要在这里再说一遍;

2) 不允许修改引用的域对象。//这个好理解不允许修改,还不加上

3) 不允许被覆写的方法,如:POJO 类的 setter 方法。//没遇到过啊自动生成了

4) 不允许运行过程中重新赋值的局部变量。//常量???反正常量定义了也不能改

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

19.类成员与方法访问控制从严:

1) 如果不允许外部直接通过 new 来创建对象,那么构造方法必须是 private。

2) 工具类不允许有 public 或 default 构造方法。

3) 类非 static 成员变量并且与子类共享,必须是 protected。

4) 类非 static 成员变量并且仅在本类使用,必须是 private。

5) 类 static 成员变量如果仅在本类使用,必须是 private。

6) 若是 static 成员变量,考虑是否为 final。

7) 类成员方法只供类内部调用,必须是 private。

8) 类成员方法只对继承类公开,那么限制为 protected。

集合处理

1.equals和hashcode方法:只要覆写了equals必须覆写hashcode;set存储对象必须覆写这两个方法;自定义的map写需要覆写这两个方法;

2.ArrayList 的 subList 结果不可强转成 ArrayList,否则会抛出 ClassCastException 异常,subList 返回的是 ArrayList 的内部类 SubList,并不是 ArrayList 而是 ArrayList 的一个视图,对于 SubList 子列表的所有操作最终会反映到原列表上。在subList场景中,高度注意对原集合元素的增加或删除,均会导致子列表的遍

历、增加、删除产生 ConcurrentModificationException 异常。

集合这种list视图还是第一次听说

3.使用Map的方法keySet()/values()/entrySet()返回集合对象时,不可以对其进行添加元素操作,否则会抛出 UnsupportedOperationException 异常

4.使用集合转数组的方法,必须使用集合的toArray(T[]array),传入的是类型完全一致、长度为 0 的空数组。

List list = new ArrayList<>(2);

list.add("guan");

list.add("bao");

String[] array = list.toArray(new String[0]);

5.使用工具类Arrays.asList()把数组转换成集合时,不能使用其修改集合相关的方法,它的 add/remove/clear 方法会抛出 UnsupportedOperationException 异常。说明:asList 的返回对象是一个 Arrays 内部类,并没有实现集合的修改方法。Arrays.asList 体现的是适配器模式,只是转换接口,后台的数据仍是数组。

public static void main(String[] args) {

String[] s =new String[] {"a","b","c","d"};

List list = Arrays.asList(s);

list.stream().forEach(i-> System.out.println(i));

list.set(0,"f");

//        list.add("f");  这里就如文中所说的一样会抛出异常;

        list.stream().forEach(i-> System.out.println(i));

s[0] ="a";

list.stream().forEach(i-> System.out.println(i));

}//这里可以看到只要set改变了值之后就会改变,然后数组改回来之后又编程了abcd;

6.泛型通配符<?extendsT>来接收返回的数据,此写法的泛型集合不能使用add方法,而<? super T>不能使用 get 方法,作为接口调用赋值时易出错。说明:扩展说一下 PECS(Producer Extends Consumer Super)原则:第一、频繁往外读取内容的,适合用<? extends T>。第二、经常往里插入的,适合用<? super T>

简单来说就是 <? extends C> 上界为 C 类型范围粗略理解为 [C,+∞),不允许添加除 null 的元素,获取的元素类型是 C ;

<? super C> 下界为 C 类型范围粗略理解为 (-∞,C],允许添加 C 以及 C 的子类类型的元素,获取的元素类型是 Object

add():编译器只知道类型是 C 或 C 的子类,所以有可能是 C D E F 其中一个类型,为保证类型安全不能添加除了 null 以外的任何元素,即使是 C 本身也不行

get():既然编译器不知道此时集合中的元素是 C D E F 的哪一个,返回类型只能是他们共同父类 C 类型。


add():编译器只知道类型是 C 或者 C 的父类,所以有可能是 A B C 其中一个类型。编译器知道下界是 C ,根据类型向上兼容所以可以添加的元素是 C 以及 C 的子类(单车可以代表车)。

get():既然编译器不确定集合类型是 A B C 的哪一种,返回类型只能是他们的共同父类 Object 。

特点:<? extends C> 的 add() 被限制,<? super C> 的 get() 被限制

7.在无泛型限制定义的集合赋值给泛型限制的集合时,在使用集合元素时,需要进行instanceof 判断,避免抛出 ClassCastException 异常。

8.不要在 foreach 循环里进行元素的 remove/add 操作。remove 元素请使用Iterator 方式,如果并发操作,需要对 Iterator 对象加锁。面试的时候遇到过一次

9.高度注意 Map 类集合 K/V 能不能存储 null 值的情况,如下表格:

集合类KeyValueSuper说明

Hashtable不允许为 null不允许为 nullDictionary线程安全

ConcurrentHashMap不允许为 null不允许为 nullAbstractMap锁分段技术(JDK8:CAS)

TreeMap不允许为 null允许为 nullAbstractMap线程不安全

HashMap允许为 null允许为 nullAbstractMap线程不安全

反例:由于 HashMap 的干扰,很多人认为 ConcurrentHashMap 是可以置入 null 值,而事实上,存储null 值时会抛出 NPE 异常。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容