阿里Java规范-01-编程规约

=================(一)命名风格==================
关于Java的接口描述,下列哪些说法符合《阿里巴巴Java开发手册》:【BCD】多选
A .在接口类中的方法和属性使用public修饰符。
B .对于Service类,内部的实现类加Impl的后缀与接口区别。例如:ProductServiceImpl实现ProductService接口。
C .对于Service类,基于SOA的理念,是以接口方式暴露服务。
D .尽量不在接口里定义变量,如果一定要定义变量,肯定是与接口方法相关,而且是整个应用的基础常量。

关于类命名,下列哪些说法符合《阿里巴巴Java开发手册》:【ABCD】多选
A .抽象类命名使用Abstract或Base开头。
B .异常类命名使用Exception结尾。
C .测试类命名以它要测试的类的名称开始,以Test结尾。
D .如果使用到了设计模式,建议在类名中体现出具体模式。例如代理模式的类命名:LoginProxy;观察者模式命名:ResourceObserver。

关于变量、方法名包的命名下列哪些说法符合《阿里巴巴Java开发手册》:【ABCD】多选
A .POJO类中的任何布尔类型的变量,都不要加is,因为部分框架解析时有可能会出现序列化错误。
B .包名统一使用单数形式,如:com.alibaba.mpp.util。
C .中括号是数组类型的一部分,数组定义如下:String[] args; 不要误写为String args[];
D .Service/DAO层方法命名可以参考规约,例如:删除的方法推荐使用remove或delete做前缀。

关于类和方法的命名,下列哪些说法符合《阿里巴巴Java开发手册》:【ABD】多选
A.类名使用UpperCamelCase命名法,但是领域模型命名除外,如:ProductDO的命名是规范的。
B.方法名命名应该使用lowerCamelCase命名法,如方法名:getHttpMessage()是符合命名规范的。
C.为了方便理解,方法名域参数名可以使用拼音与英文混合的方式。
D.所有编程相关的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束。

以下关于命名规约内容说明,正确的是:【BCD】多选
A .【强制】包名统一使用小写,点分隔符之间有且仅有一个自然语义的英语单词,并且使用复数形式,例如:应用工具类包名为com.alibaba.mpp.utils
B .【强制】类名使用UpperCamelCase,必须遵从驼峰形式,但以下情形例外:(领域模型的相关命名)DO / DTO / VO / DAO等。
C .【强制】抽象类命名使用Abstract或Base开头;异常类命名使用Exception结尾;测试类命名以它要测试的类的名称开始,以Test结尾。
D .【强制】枚举类名建议带上Enum后缀,枚举成员名称需要全大写,单词间用下划线隔开。

下面的例子代码和描述,哪些是不正确的:【AD】多选
A. 单行字符数限制不超过140个,超出需求换行
B. IDE的text file encoding设置为GBK;IDE中文件的换行符使用Unix格式,不要使用windows格式。
C. 大括号与if,else,for,do,while语句一起使用,即使只有一条语句(或是空),也应该把大括号写上。
D. 大括号的使用约定。如果是大括号内为空,则简洁地写成{}即可,不需要换行;
=================(二)常量定义==================

关于枚举类型,以下描述符合规范的是:【BC】多选
A.只要是常量,就使用校举值.
B.如果变量值在一个范围内变化,而且还带有名称之外的延伸属性,必须使用Enum类,如: publc enum MonthEnm( JANUARY(1),FEBRARY(2),MCAC (I) 3, APA14DDEME 12)
C.枚举名命名建议带上Enum,枚举成员名称需要全大写,单词用"_"分割。
D.定义星期一至星期日这种范围固定的信息,不推荐使用校举类型。
文档:【推荐】如果变量值仅在一个范围内变化用 Enum 类。如果还带有名称之外的延伸属性,必须
使用 Enum 类,下面正例中的数字就是延伸信息,表示星期几。
正例:public Enum{ MONDAY(1), TUESDAY(2), WEDNESDAY(3), THURSDAY(4), FRIDAY(5),
SATURDAY(6), SUNDAY(7);}

关于常量定义,下列哪些说法符合《阿里巴巴Java开发手册》:【AC】多选
A .不允许出现任何魔法值(即未经预先定义的常量)直接出现在代码中。
B .魔法值是指程序中随意定义并赋值的变量值,如果代码编写者明白变量值意义是可以任意使用的,例如在代码中写if(status == 3) return error;符合规范。
C .如果变量值仅在一个范围内变化推荐用Enum类。
D .在程序中,一律禁止使用枚举类型。

关于变量和常量定义,下列哪些符合《阿里巴巴Java开发手册》:【AD】多选
A .Long a=2L;//大写的L
B .Long a=2l; //小写的l
C .常量只定义一次,不再赋值,所以不需要命名规范。
D .不要使用一个常量类维护所有常量,应该按常量功能进行归类,分开维护。

关于常量定义,下列哪些说法符合《阿里巴巴Java开发手册》【BD】多选
A.像"yes","no","success","Y","N",这些简单的词,可以直接在代码中使用,不必定义成常量形式。
B.即使是"yes","no","success","Y","N",看似简单的词,也必须定义成常量形式。
C.不要在一个常量类中,维护本应用所有常量,按常量功能进行归类。
D.大而全的常量类,可以通过文本搜索(文本查找)功能定位到修改的常量,没有增加理解和维护代价。

关于常量定义,下列哪些说法符合《阿里巴巴Java开发手册》:【ABD】多选
A.跨应用共享常量:放置在二方库中,通常是client.jar中的const目录下。
B.应用内共享常量:通常放置在一方库的子模块中的const目录下。
C.子工程内部共享常量:即在当前子工程的const目录下。
D.类内常量:直接在类内部privates static final定义。

关于常量的命名,下列哪些说法符合《阿里巴巴Java开发手册》:【ABD】多选
A .常量命名应该全部大写,单词间用下划线隔开。
B .常量的定义要力求语义表达完整清楚,让别人能从常量名称上大致了解含义,例如:MAX_STOCK_COUNT。
C .常量命名,可以使用拼音与英文的混合方式。
D .在使用缩写时要注意:杜绝不规范的缩写。

=================(三)代码格式==================
关于代码书写格式,下列哪些说法符合《阿里巴巴Java开发手册》:【BCD】
A.换行时相对上一行缩进2个空格。
B.运算符与下文一起换行,方法调用的点符号与下文一起换行。
C.在多个参数超长,逗号后进行换行。
D在括号前不要换行。
文档:【强制】单行字符数限制不超过 120 个,超出需要换行,换行时,遵循如下原则:
1) 换行时相对上一行缩进 4 个空格。
2) 运算符与下文一起换行。
3) 方法调用的点符号与下文一起换行。
4) 在多个参数超长,逗号后进行换行。
5) 在括号前不要换行,见反例。

关于文件编码和格式的设定,下列哪些说法符合《阿里巴巴Java开发手册》:【BC】多选
A .IDE的text file encoding设置为GBK格式。
B .IDE的text file encoding设置为UTF-8格式。
C .IDE中文件的换行符使用unix格式。
D .IDE中文件的换行符使用windows格式。

以下关于格式规约的说法,正确的有哪些:【AD】多选
A .代码块缩进4个空格,如果使用tab缩进,请设置成1个tab为4个空格;
B .代码块缩进5个空格,如果使用tab缩进,请设置成1个tab为5个空格。
C .为了保持代码美观,《手册》强烈推荐增加若干空格,使某一行的变量与相邻对应位置的变量对齐。
D .方法体内的执行语句组、变量的定义语句组、不同的业务逻辑之间或者不同的语义之间推荐插入一个空行;相同业务逻辑和语义之间不需要插入空行。

以下关于格式规约的说法,正确的有哪些:【ABD】多选
A.左括号和后一个字符之间不出现空格;同样,右括号和前一个字符之间不出现空格,例如:if(flag == 1){System.out.println("world");}
B.If/for/while/switch/do等保留字与左右括号之间都必须加空格;
C.while这个保留字比较特殊,使用时左右括号之间可以不用加空格,例如:while(true){...}
D.任何运算符左右必须加一个空格,运算符包括赋值运算符=、逻辑运算符&&、加减乘除符号、三目运行符等。

=================(四)OOP规约==================
关于类的序列化,下列说法哪些是正确的:【D】单选
A .类的序列化与serialVersionUID毫无关系。
B .如果完全不兼容升级,不需要修改serialVersionUID值。
C .POJO类的serialVersionUID不一致会编译出错。
D .POJO类的serialVersionUID不一致会抛出序列化运行时异常。

关于类和方法,下列哪些符合《阿里巴巴Java开发手册》: 【ABC】
A.任何类、方法、严控访问范围。因为过宽泛的访问范围,不利于模块解耦。
B.对外暴露的接口签名,原则上不允许修改,宁可新增,避免对依赖端产生影响。
C.如果新增一个功能完全相同的新接口,过时接口必须加@deprecated注释。
D. 所有过时的类与方法不得使用。
根据:文档的:对外暴露的接口签名, 原则上不允许修改方法签名,避免对接口调用方产生影响。接口过时必须加@Deprecated 注解,并清晰地说明采用的新接口或者新服务是什么。

关于基本数据类型与包装数据类型的使用标准,下列哪些说法符合《阿里巴巴Java开发手册》:【ABD】多选
A .所有的POJO类属性必须使用包装数据类型。
B .RPC方法的返回值和参数必须使用包装数据类型。
C .因为JAVA的自动装箱与拆箱机制,不需要根据场景来区分数据类型。//容易选错
D .所有的局部变量推荐使用基本数据类型。

在定义DO/DTO/VO/等POJO类时,对属性默认值的设定,下列哪些说法符合《阿里巴巴Java开发手册》:【D】单选
A .String类型的默认值设定为空字符串。
B .Date类型的默认值设定为new Date()。
C .集合类型的默认值设定为Collections.EMPTY_LIST。
D .不要设定任何属性默认值。

关于Java的方法使用,下列哪些说法符合《阿里巴巴Java开发手册》:【AD】多选
A.Ojbect的equals方法容易抛空指针,使用常量或确定有值的对象来调用equals方法
B.所有的相同类型的包装类对象之间值的比较,全部使用equals方法比较。//原问题是指所有整型包装类
C.DO/VO等领域模型类不需要覆写Ojbect#toString()方法,没啥用处。
D.慎用Ojbect#clone()方法来拷贝对象。

关于Integer值的比较,下列哪些说法是正确的:【AD】多选
A.Integer a = 3 ; Integer b = 3;那么条件表达式(a == b)返回的结果是 true。
B.Integer a = 3 ;Integer b = 3;那么条件表达式(a == b )返回的结果是false。
C.Integer a = 273;Integer b = 273;那么条件表达式(a == b) 返回的结果是true。
D.Integer a = 273;Integer b = 273;那么条件表达式 (a == b)返回的结果是false。

关于Java代码的设计和开发注意事项,下列哪些说法符合《阿里巴巴Java开发手册》:【ABC】多选
A .所有的覆写方法,必须是强制加 @Override。
B .setter方法中,参数名称与类成员变量名称一致,this.成员名=参数名。
C .在getter方法中,尽量不要增加逻辑判断,因为添加了逻辑判断后,会增加排查问题难度。
D .避免用BeanUtil进行属性的copy。

关于构造方法,下列哪些说法符合《阿里巴巴Java开发手册》:【ABC】多选
A. 构造方法里面禁止加入任何业务逻辑,如果有初始化逻辑,请放在init方法中。
B. 当一个类有多个构造方法,应该按顺序放置在一起,便于阅读。
C. 如果不允许外部直接通过new来创建对象,那么构造方法必须是private。
D. 构造方法中可以有业务实现代码,如果成员变量的简单运算、业务判断等。

=================(五)集合处理==================
sort表示元素在存入集合时进行了排序,数据遍历的结果是按某个排序规则输出的;而order表示每次遍历的序列都是一样的,元素前后关系每次遍历都是确定的,那么下列哪些集合既是sort,又是order的:【D】单选
A、HashSet
B、LinkedList
C、HashMap
D、TreeMap

集合在遍历过程中,有时需要对符合一定条件的元素进行删除,下列哪些说法是正确的:【B】单选
A .在 foreach 循环里进行元素的 remove操作。
B .使用Iterator方式,如果有并发,需要对Iterator对象加锁。
C .Iterator进行元素的删除操作,绝对是线程安全的。
D .Java无法实现在遍历时,进行删除元素操作。

关于Map类型集合的遍历方式,下列哪些说法是正确的:【D】单选
A .Map类型的实现类都同时实现了Iterator接口。
B .使用foreach进行遍历。
C .推荐使用keySet进行遍历。
D .推荐使用entrySet进行遍历。

Hashtable,HashMap, ConcurrentHashMap都是Map的实现类,它们在处理null值的存储上有细微的区别,下列哪些说法是正确的:【ABD】多选
A .Hashtable的KV都不可以为null。
B .HashMap的KV都可以为null。
C .HashMap的K不可以为null,V可以为null。
D .ConcurrentHashMap的KV都不可以为null。

数组使用Arrays.asList转化为集合,下列说法哪些正确的:【ACD】多选
A .数组元素的修改,会影响到转化过来的集合。
B .数组元素的修改,不会影响到转化过来的集合。
C.对于转换过来的集合,它的 add/remove/clear 方法会抛出:
UnsupportedOperationException。
D .Arrays.asList 体现的是适配器模式,只是转换接口,后台的数据仍是数组。

通过集合A.subList()获取子集合B,下列说法哪些是正确的:【ABD】多选
A .返回的集合B没有实现Serializable接口,不能被序列化,所以不能应用于RPC场景。
B .在B集合中添加某个元素,那么A集合也会添加进去此元素。
C .集合A中元素的修改不会影响到集合B的任何操作。
D .对A元素个数的修改,会导致集合B的遍历产生ConcurrentModificationException 异常。

KV结构的集合,在处理null值的存储上有细微的区别,下列哪些说法是正确的:【A】单选
A .TreeMap的key不可以为null
B .TreeMap的key可以为null
C .ConcurrentHashMap的key可以为null
D .ConcurrentHashMap的value可以为null

关于hashcode和equals,下列哪些说法是正确的:【BC】多选
A. hashcode是Class的方法,equals是Objcet的方法
B. hashcode决定(如:hashMap)存储位置;equals决定是否需要覆盖(同一hash下)集合元素。
C. 类重写hashcode,必须重写equals。
D. 两者是否需要重写,没有必然联系。

list子类使用toarray方法实现集合向数组转换,下列哪些说法是正确的:【B】单选
A. Vector无法使用toArray转换成数组。
B. 优先推荐:调用集合类的方法toArray(T[] a),传入的是类型完全一样的数组,大小就是集合的size()。
C. 集合的修改,会影响到数组元素的改变。
D. 数组的修改,会影响到集合元素的改变。

=================(六)并发处理==================
关于并发处理,下列哪些说法符合《阿里巴巴Java开发手册》:【ABC】多选
A .线程资源必须通过线程池提供,不允许在应用中自行显式创建线程。
B .同步处理时,能锁部分代码区块的情况下不要锁整个方法;高并发时,同步调用应该考虑到性能损耗。
C .创建线程或线程池时,推荐给线程指定一个有意义的名称,方便出错时回溯。
D .推荐使用Executors.newFixedThreadPool(int x)生成指定大小的线程池。(线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式)

关于线程安全,下列哪些说法是正确的:【ACD】多选
A .SimpleDateFormat 是线程不安全的类。
B .SimpleDateFormat 是线程安全的类。
C .一般不要定义SimpleDateFormat的static变量,如果定义为static,必须保证线程安全。
D .推荐使用Apache封装好的DateUtils和DateFormatUtils工具类,来处理时间日期转换问题。

关于【多线程并行处理定时任务】的情况,下列哪些说法符合《阿里巴巴Java开发手册》:【BCD】
A .推荐使用Timer方式处理。
B .推荐使用ScheduledExecutorService方式处理。
C .Timer运行多个TimeTask时,只要其中之一没有捕获抛出的异常,其它任务便会自动终止运行。
D .ScheduledExecutorService并发运行多个定时任务时,其中某线程抛出异常,不会影响到其它线程的继续运行。//好好理解

关于线程池的创建,下列哪些说法符合《阿里巴巴Java开发手册》【ABC】多选
A. 线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式
B. new FixedThreadPool和new SingleThreadPool的主要问题是堆积的请求处理队列可能会耗费非常大的内存,甚至OOM。
C. new CachedThreadPool和new ScheduledThreadPool的主要问题是线程数量最大数是Integer.MAX_VALUE,可能会创建数量非常多的线程,甚至OOM。
D. 我们的机器运算速度够快,所以线程池的创建并不需要特别的约定。

关于线程池管理线程的好处,下列哪些说法是正确的:【AC】多选
A.能够减少在创建和销毁线程上所花的时间以及系统资源的开销。
B.使用线程池一定能避免OOM问题。
C.线程资源必须通过线程池提供,不允许在应用中自行显式创建线程。
D.线程池能够根据资源等待情况,自动调整线程优先级并解决死锁问题。

关于加锁,下列哪些说法符合《阿里巴巴Java开发手册》:【ABCD】
A .可以只锁代码区块的情况下,就不要锁整个方法体。
B .高并发的业务场景下,要考虑加锁及同步处理带来的性能损耗,能用无锁数据结构,就不要用锁。
C .能用对象锁的情况下,就不要用类锁。
D .加锁时需要保持一致的加锁顺序,否则可能会造成死锁。

在多线程并发读写的情况下,下列哪些处理方式能保证对象的线程安全:【BCD】
A .使用volatile关键字。(volatile 解决多线程内存不可见问题。对于一写多读,是可以解决变量同步问题,
但是如果多写,同样无法解决线程安全问题。)
B .使用synchronized关键字给对象的读写操作加锁。
C .如果是基本类型,推荐使用java.util.concurrent.atomic包下面提供的线程安全的基本类型包装类,例如AtomicInteger。
D .如果是集合,推荐使用java.util.concurrent提供的并发集合类,例如:ConcurrentHashMap。

使用CountDownLatch进行异步转同步操作时,下列哪些说法是正确的:【AB】多选
A. 每个线程退出前必须调用countDown()方法。
B. 线程执行代码注意catch异常,确保countDown()方法可以被执行。
C. 子线程抛出异常堆栈,直接就可以在主线程catch到。
D. 主线程必须 在启动其他线程后调用await()方法,这样主线程的操作就会在这个方法上阻塞,直到其他线程完成各自的任务。

=================(七)控制语句==================
关于参数校验,下列哪些说法符合《阿里巴巴Java开发手册》:【ABCD】
A.批量处理接口必须做好接口入参保护
B.需要极高稳定性和可用性的方法需要对参数进行校验
C.底层的方法,在上层调用中参数多半已经被校验过,可以考虑不校验。
D.对外提供的开放接口,都要进行参数检验。
文档:【推荐】接口入参保护,这种场景常见的是用于做批量操作的接口。
【参考】方法中需要进行参数校验的场景:
1) 调用频次低的方法。
2) 执行时间开销很大的方法,参数校验时间几乎可以忽略不计,但如果因为参数错误导致中间执行回退,或者错误,那得不偿失。
3) 需要极高稳定性和可用性的方法。
4) 对外提供的开放接口,不管是 RPC/API/HTTP 接口。
【参考】方法中不需要参数校验的场景:
1) 极有可能被循环调用的方法,不建议对参数进行校验。但在方法说明里必须注明外部参数检查。
2) 底层的方法调用频度都比较高,一般不校验。毕竟是像纯净水过滤的最后一道,参数错误不太可能到底层才会暴露问题。一般 DAO 层与 Service 层都在同一个应用中,部署在同一台服务器中,所以 DAO 的参数校验,可以省略。
3) 被声明成 private 只会被自己代码所调用的方法,如果能够确定调用方法的代码传入参数已经做过检查或者肯定不会有问题,此时可以不校验参数。

关于控制语句,下列哪些说法符合《阿里巴巴Java开发手册》:【ABD】多选
A .推荐 if-else的方式可以改写成卫语句的形式。
B .尽量减少try-catch 块内的逻辑,定义对象、变量、获取数据库连接等操作可以移到try-catch块外处理
C .if ( condition) statements; 单行语句不需要使用大括号。
D .在一个switch块内,都必须包含一个default语句并且放在最后,即使它什么代码也没有。

=================(八)注释规约==================
关于代码注释,下列哪些说法符合《阿里巴巴Java开发手册》:【ABD】多选
A .特殊注释标记,请注明标记人与标记时间。
B .待办事宜(TODO):( [标记人,标记时间,[预计处理时间])
C .在注释中用FIXME标记某代码虽然实现了功能,但是实现的方法有待商榷,希望将来能改进。 // XXX
D .在注释中用FIXME标记某代码是错误的,而且不能工作,需要及时纠正的情况
提示:FIXME可以看成fix me修理我,有错误才处理,对吧!
TODO:代做如果代码中有该注释,说明在该注释处有功能代码待编写,待实现的功能在说明中会简略说明。


image.png

关于代码注释,下列哪些说法符合《阿里巴巴Java开发手册》:【ACD】多选
A .所有的抽象方法(包括接口中的方法)必须要用javadoc注释。
B .所有的方法,包括私有方法,最好都增加注释,有总比没有强。
C .过多过滥的注释,代码的逻辑一旦修改,修改注释是相当大的负担。
D .我的命名和代码结构非常好,可以减少注释的内容。

关于注释,下列哪些说法符合《阿里巴巴Java开发手册》:【BC】多选
A .方法头定义签名上的注释可以使用//(双划线)简单说明,不必要遵守javadoc规范。(/** /)
B .类定义开始部分,一般都用Javadoc注释 程序的总体描述以及作者信息。
C .方法头定义签名上的注释必须遵守javadoc规范,使用/
*回车来生成,不得在方法定义上方使用//(双划线)简单说明。
D .方法头定义签名上的注释,可以使用// xxx 的形式

关于注释,下列哪些说法符合《阿里巴巴Java开发手册》:【ABCD】多选
A. 方法内部单行注释,在被注释语句上方另起一行,使用//注释。
B. 所有的类都必须添加创建者信息。
C. 相比较使用“半吊子”英文来注释,用中文注释把问题说清楚更合适。
D. 所有的枚举型字段必须要有注释,说明每个数据项的用途。

=================(九)其它==================
下列哪些说法符合《阿里巴巴Java开发手册》:【ACD】多选
A .对于“明确停止使用的代码和配置”,如方法、变量、类、配置文件、动态配置属性等要坚决从程序中清理出去,避免造成过多垃圾。
B .永久弃用的代码段注释掉即可,即不用加任何注释。
C .对于暂时被注释掉,后续可能恢复使用的代码片断,在注释代码上方,统一规定使用三 个斜杠(///)来说明注释掉代码的理由。
D .不要在视图模板中加入任何复杂的逻辑。

下列哪些说法符合《阿里巴巴Java开发手册》【ABCD】多选
A.在使用正则表达式时,利用好其预编译功能,可以有效加快正则匹配速度。
B.在JDK8中,针对统计时间等场景,推荐使用Instant类。
C.尽量不要在vm中加入变量声明、逻辑运算符,更不要在vm模板中加入任何复杂的逻辑。
D.后台输送给页面的变量必须加$!{var}——中间的感叹号。

你可能感兴趣的:(阿里Java规范-01-编程规约)