阿⾥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 .推荐使⽤wFixedThreadPool(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 .如果是基本类型,推荐使⽤urrent.atomic包下⾯提供的线程安全的基本类型包装类,例如AtomicInteger。
D .如果是集合,推荐使⽤urrent提供的并发集合类,例如:ConcurrentHashMap。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。