阿里巴巴Java开发手册学习小结3-OOP规约
来源:互联网 发布:fcc 网络中立 编辑:程序博客网 时间:2024/05/20 20:57
本次学习 来源 阿里巴巴Java开发手册 ,文档更新时间2016.12.7 是阿里巴巴集团技术部 首次向Java业界公开,如果有需要开发手册源文档的,欢迎联系
编程规范
OOP规约
1.【强制】避免通过一个类的对象引用访问此类的静态变量或静态方法,无谓增加编译器解析成本,直接用类名来访问即可
2.【强制】所有的复写方法,必须加 @Override
注解
3.【强制】相同参数类型,相同业务含义,才可以使用Java的可变参数,避免使用Object。
说明:可变参数必须放置在参数列表的最后。(提倡同学们尽量不用可变参数编程)
正例:public User getUsers(String type,Intrger... ids)
4.【强制】对外暴露的接口签名,原则上不允许修改 方法签名,避免对接口调用方产生影响。接口过时必须加 @Deprecated
注解,并清晰说明采用的新接口或者新服务是什么。
5.【强制】不能使用过时的类或者方法
说明:java.net.URLDecoder 中的decode(String encodeStr) 这个方法已经过时,应该使用双参数decode(String source, String encode)。接口方既然明确是过时接口,那么有义务同时提供新的接口;作为调用方来说,有义务去考证过时方法的新实现是什么。
6.【强制】Object 的equals 方法容易容易抛空指针异常,应使用常量或者确定有值的对象来调用equals
正例:"test".equals(object)
7.【强制】所有的相同类型的包装类对象之间的值的比较,全部使用equals方法比较。
8.【强制】关于基本数据类型与包装数据类型的使用标准如下:
- 1 所有的POJO类属性必须使用包装数据类型
- 2 RPC 方法的返回值和参数必须使用包装数据类型
- 3 所有的局部变量推荐使用基本数据类型。
9【强制】定义DO/DTO/VO 等POJO类时,不需要设定任何属性默认值。
10.【强制】序列化类新增属性时,请不要修改serialVersionUID字段,避免反序列化失败;如果完全不兼容升级,避免反序列化混乱,那么请修改serialVersionUID值
11.【强制】构造方法中严禁加入任何业务逻辑,如果有初始化逻辑,请放在init方法中。
12.【强制】POJO类必须写toString方法,使用工具类 source>generate toString 时,如果集成了另一个POJO类,注意在前面加一下super.toString。
说明:在方法执行抛出异常时,可以直接调用POJO的toString()方法打印其属性值,便于排查问题。
package com.pptv.common.data.epg.actors;import com.pptv.common.data.JumpPramsOttEpg;import java.io.Serializable;/** * Created by patrickji on 2016/6/7. */public class ChannelBean implements Serializable { private String id; private String title; private String coverPic; private String vt; private String type; private String infoId; private String vip; private String score; private int pay; private int vipPrice; private String shotPic; private String icon; private String img_payment_cornermark_url;//权益类角标 private String img_program_type_cornermark_url;//节目类型角标 private JumpPramsOttEpg jumpPrams; public String getIcon() { return icon; } public void setIcon(String icon) { this.icon = icon; } public String getShotPic() { return shotPic; } public void setShotPic(String shotPic) { this.shotPic = shotPic; } public int getVipPrice() { return vipPrice; } public void setVipPrice(int vipPrice) { this.vipPrice = vipPrice; } public int getPay() { return pay; } public void setPay(int pay) { this.pay = pay; } public String getScore() { return score; } public void setScore(String score) { this.score = score; } public String getVip() { return vip; } public void setVip(String vip) { this.vip = vip; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getCoverPic() { return coverPic; } public void setCoverPic(String coverPic) { this.coverPic = coverPic; } public String getVt() { return vt; } public void setVt(String vt) { this.vt = vt; } public String getType() { return type; } public void setType(String type) { this.type = type; } public String getInfoId() { return infoId; } public void setInfoId(String infoId) { this.infoId = infoId; } public String getImg_payment_cornermark_url() { return img_payment_cornermark_url; } public void setImg_payment_cornermark_url(String img_payment_cornermark_url) { this.img_payment_cornermark_url = img_payment_cornermark_url; } public String getImg_program_type_cornermark_url() { return img_program_type_cornermark_url; } public void setImg_program_type_cornermark_url(String img_program_type_cornermark_url) { this.img_program_type_cornermark_url = img_program_type_cornermark_url; } public JumpPramsOttEpg getJumpPrams() { return jumpPrams; } public void setJumpPrams(JumpPramsOttEpg jumpPrams) { this.jumpPrams = jumpPrams; } @Override public String toString() { return "ChannelBean{" + "id='" + id + '\'' + ", title='" + title + '\'' + ", coverPic='" + coverPic + '\'' + ", vt='" + vt + '\'' + ", type='" + type + '\'' + ", infoId='" + infoId + '\'' + ", vip='" + vip + '\'' + ", score='" + score + '\'' + ", pay=" + pay + ", vipPrice=" + vipPrice + ", shotPic='" + shotPic + '\'' + ", icon='" + icon + '\'' + ", img_payment_cornermark_url='" + img_payment_cornermark_url + '\'' + ", img_program_type_cornermark_url='" + img_program_type_cornermark_url + '\'' + ", jumpPrams=" + jumpPrams + '}'; }}
13.【推荐】使用索引访问用String的split方法得到的数组时,需做最后一个分隔符后有无内容的检查,否则会有抛IndexOutOfBoundsException 的风险。
说明:String str = "a,b,c,,";String[] ary = str.split(",");
//预期大于3,结果是3
System.out.println(ary.length);
14.【推荐】当一个类有多个构造方法或者多个同名方法,这些方法应该按顺序放置在一起,便于阅读。
15.【推荐】类内方法定义顺序依次是:公有方法或保护方法>私有方法> getter/setter方法
16.【推荐】setter方法中,参数名称与类成员名称一致,this.成员名=参数名。在getter/setter 方法中,尽量不要增加业务逻辑,增加排查问题难度。
反例:
public Integer getData(){ if(true){ return data + 100; }else{ return data -100; }}
17.【推荐】循环体内字符串的连接方式,使用StringBuilder 的append 方法进行扩展。
反例:
String str = "start";for(int i = 0; i < 100; i++){ str = str +"hello";}
说明:反编译出的字节码文件显示每次循环都会new出一个StringBuilder 对象,然后进行append操作,最后通过toString 方法返回String 对象,造成内存资源浪费。
18.【推荐】final可提高程序响应效率,声明成final的情况:
- 1 不需要重新赋值的变量,包括类属性,局部变量。
- 2 对象参数前加final,表示不允许修改引用的指向。
- 3 类方法确实不允许被重写。
19.【推荐】 慎用Object的clone 方法来拷贝对象
说明:对象clone方法默认是浅拷贝,若想实现深拷贝需要重写clone方法实现属性对象的拷贝。
20.【推荐】类成员与方法访问控制从严:
- 1, 如果不允许外部直接通过new来创建对象,那么构造方法必须是private。
- 2, 工具类不允许有public 或default 构造方法
- 3, 类非static成员变量并且与子类共享,必须是protected.
- 4 , 类非static 成员变量仅在本类使用,必须是private。
- 5, 类static 成员变量如果仅在本类使用,必须是private。
- 6 , 若是static成员变量,必须考虑是否为final。
- 7 , 类成员变量仅供类内部调用,必须是private。
- 8,类成员变量只对继承类公开,那么限制为protected。
说明:任何类、方法、参数、变量,严控访问范围。过宽泛的访问范围,不利于模块解耦。思考:如果是一个private的方法,想删除就删除,可是一个public的Service方法,或者一个public的成员变量,删除一下,不得手心冒点汗吗?变量像自己的小孩,尽量在自己的视线内,变量作用域太大,如果无限制的到处跑,那么你会担心的。
- 阿里巴巴Java开发手册学习小结3-OOP规约
- 阿里巴巴Java开发手册学习-OOP规约
- 阿里巴巴Java开发手册- 编程规约-OOP规约
- 阿里巴巴Java开发手册学习小结2-格式规约
- 阿里巴巴Java开发手册学习小结7-注释规约
- 阿里巴巴Java开发手册学习笔记-编程规约
- 【JAVA-规约】阿里巴巴JAVA开发手册
- 【Java开发手册之编程规约(四)】OOP规约
- 阿里巴巴Java开发手册- 编程规约-其他
- 阿里巴巴Java开发手册-安全规约
- 阿里巴巴Java开发手册-安全规约
- 阿里巴巴Java开发手册编程规约
- 阿里巴巴Java开发手册-命名规约
- 阿里巴巴Java开发手册-命名规约
- 白话阿里巴巴Java开发手册(编程规约)
- 阿里巴巴Java开发手册-编程规约
- 阿里巴巴Java开发手册-命名规约
- 阿里巴巴Java开发手册-命名规约
- spark学习-54-Spark RDD的clean()方法
- 模板
- 重复造轮子-C语言风格string库函数的实现
- 1407 用两种方法对IPV6地址进行压缩的c程序实现
- C语言动态数组建立方法
- 阿里巴巴Java开发手册学习小结3-OOP规约
- leetcode 415. Add Strings 字符串加法
- 求助!!!!急!!!
- Tomcat 日志分割.
- Tag文件的创建与应用
- SSM 框架 Maven项目整合实例
- git 命令--上传代码 && Window系统下搭建GIT本地服务器
- 自动化运维工具ansible的安装与使用
- foreach的continue和break : Uncaught SyntaxError: Illegal continue statement