点点赞 不迷路 文末领取博主精心为大家准备的面试渡劫大礼包
作为一名开发人员,当你接手他人的项目时,且当你阅读他人的代码时,是否急火攻心,暴跳如雷过,甚至有着大爆粗口的想法,此时的你看着那些密密麻麻的代码就如同天书一般,羞涩难懂。反正我是有过,你们呢?
Robert Martin曾说过"在代码阅读中说脏话的频率是衡量代码质量额唯一标准"。当你发现别人看你的代码时频频点头,甚至投出欣赏的目光,那么我想此时你的心情也会随着他人一起愉悦,那种成就感对于程序员来说,是一种说不上的幸福!话不多说,直接干货!
本文完全采用阿里巴巴的java开发规范
如果您习惯用IDEA进行代码开发,推荐一款实用的插件:Alibaba Java Coding Guidelines,可实时帮助我们检测代码规范!(本文重点在规范层面,具体用法且见下回分解)
头一回检测共发现 32+518+378=928处不规范的地方,甚是可怕!
说明
Apache BeanUtils性能较差,可以使用其他方案比如Spring BeanUtils, Cglib BeanCopier。
TestObject a = new TestObject();
TestObject b = new TestObject();
a.setX(b.getX());
a.setY(b.getY());
注意点:
举例:model类转entity类
private String saveProjectMessage(ProjectModel projectModel) throws Exception{
ProjectEntity projectEntity = new ProjectEntity();
// org.apache.commons.beanutils.BeanUtils;
BeanUtils.copyProperties(projectEntity,projectModel); // 摒弃
org.springframework.beans.BeanUtils.copyProperties(projectModel,projectEntity); //推荐
return commonProjectBiz.saveProject(projectEntity);
}
对于Integer var=?在-128至127之间的赋值,Integer对象是在IntegerCache.cache产生,会复用已有对象,这个区间内的Integer值可以直接使用==进行判断,但是这个区间之外的所有数据,都会在堆上产生,并不会复用已有对象,这是一个大坑,推荐使用equals方法进行判断。
Integer a = 235;
Integer b = 235;
if (a.equals(b)) {
// code
}
反例
public void f(String str){
if (str.equals("hi")) {
System.out.println("hello world");
}
}
public void f(String str){
String inner = "hi";
if (inner.equals(str)) {
System.out.println("hello world");
}
}
说明
HashMap使用如下构造方法进行初始化,如果暂时无法确定集合大小,那么指定默认值(16)即可。
反例:
Map<String, String> map = new HashMap<String, String>();
正例:
Map<String, String> map = new HashMap<String, String>(16);
说明
很多if语句内的逻辑相当复杂,阅读者需要分析条件表达式的最终结果,才能明确什么样的条件执行什么样的语句,那么,如果阅读者分析逻辑表达式错误呢?
反例
if ((file.open(fileName, "w") != null) && (...) || (...)) {
// ...
}
正例
boolean existed = (file.open(fileName, "w") != null) && (...) || (...);
if (existed) {
//...
}
反例
if (key.equals("Id#taobao_1")) {
//...
}
正例
String KEY_PRE = "Id#taobao_1";
if (KEY_PRE.equals(key)) {
//...
}
说明
关于hashCode和equals的处理,遵循如下规则:
1.只要重写equals,就必须重写hashCode
2.因为Set存储的是不重复的对象,依据hashCode和equals进行判断,所以Set存储的对象必须重写这两个方法
3.如果自定义对象做为Map的键,那么必须重写hashCode和equals。
举例
// 定义一个车牌类
public class CarNumber {
private String cityCode; // 城市代号
private String number; // 车牌号
public String getCityCode() {
return cityCode;
}
public void setCityCode(String cityCode) {
this.cityCode = cityCode;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
反例
public class Test {
public static void main(String [] args) {
// key为自定义类
Map<CarNumber, String> map =new HashMap<>(16);
CarNumber car1 = new CarNumber();
car1.setCityCode("苏A");
car1.setNumber("11111");
CarNumber car2 = new CarNumber();
car2.setCityCode("苏A");
car2.setNumber("22222");
map.put(car1, "车牌号1");
map.put(car2, "车牌号2");
// 参数内容和car2对象一样
CarNumber car3 = new CarNumber();
car3.setCityCode("苏A");
car3.setNumber("22222");
//控制台输出
System.out.println(map.get(car1));
System.out.println(map.get(car2));
System.out.println(map.get(car3));
}
}
输出结果为:
正常理解car2&car3对象从hashMap中取值应该是相同的,但如果不重写hashcode()方法,比较是其地址,car3和car2地址不同,所以不相等!
正例
public class CarNumber {
private String cityCode; // 城市代号
private String number; // 车牌号
//在CarNumber 类中重写equals()和hashCode()方法;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
CarNumber carNumber = (CarNumber) o;
return Objects.equals(cityCode, carNumber.cityCode) &&
Objects.equals(number, carNumber.number);
}
@Override
public int hashCode() {
return Objects.hash(cityCode, number);
}
}
输出结果为
原理
反例
public interface DemoService{
void f();
}
正例
public class DemoServiceImpl implements DemoService {
@Override
public void f(){
System.out.println("hello world");
}
}
说明
除注释之外的方法签名、结束右大括号、方法内代码、空行、回车及任何不可见字符的总行数不超过80行。
public void method() {
// Put single line comment above code. (Note: align '//' comment with code)
int a = 3;
/**
* Some description about follow code. (Note: align '/**' comment with code)
*/
int b = 4;
}
反例
private void $test(){
System.out.println("命名不能以美元符号开始")
}
private void _test(){
System.out.println("命名不能以下划线开始")
}
说明:如有实现和调用注意事项,请一并说明。
正例
/**
* fetch data by rule id
*
* @param ruleId 规则Id
* @param page 页数
* @param jsonContext json字符串
* @return Result 出参
*/
Result<XxxxDO> fetchDataByRuleId(Long ruleId, Integer page, String jsonContext);
反例
void selectTODOList(Map<String,Object> todoMap);
正例
void selectTODOList(Map<String,Object> todoMap);
正例
com.alibaba.mpp.util / com.taobao.tddl.domain.dto
说明
java.net.URLDecoder 中的方法decode(String encodeStr)这个方法已经过时
应该使用双参数decode(String source, String encode)。
接口提供方既然明确是过时接口,那么有义务同时提供新的接口;作为调用方来说,有义务去考证过时方法的新实现是什么。
反例
getObject()与get0bject()的问题。
一个是字母的O,一个是数字的0,加@Override可以准确判断是否覆盖成功。
另外,如果在抽象类中对方法签名进行修改,其实现类会马上编译报错。
反例
if(flag) System.out.println("hello world");
正例
if (flag) {
System.out.println("hello world");
}
public class ConstantNameDemo {
/**
* max stock count
*/
public static final Long MAX_STOCK_COUNT = 50000L;
正例
public enum TestEnum {
/**
* agree
*/
agree("agree"),
/**
* reject
*/
reject("reject");
private String action;
TestEnum(String action) {
this.action = action;
}
public String getAction() {
return action;
}
}
说明
在设置模板时,注意IDEA的@author为${USER},
而eclipse的@author为${user},大小写有区别,而日期的设置统一为yyyy/MM/dd的格式。
正例
/**
* Demo class
*
* @author java酱
* @date 2020/01/10
*/
public class CodeNoteDemo {
}
好了,本文到这里节结束啦,希望对大家有所帮助,如果有任何疑问,欢迎评论区留言
最后 : 小编在这里给大家分享一份 2019年多家公司java面试题整理120多页pdf文档的PDF,希望大家在之后的面试中和技术提升能够事半功倍,需要的朋友们点赞评论喔~
群号:530720915 点击加入 进群验证“csdn” 获取
最后
欢迎大家一起交流,整理资料不易,喜欢文章记得点个赞呗,感谢支持!!!