首页 > 作文

java编码规范有哪些(阿里巴巴java编码规范)

更新时间:2023-04-05 04:36:51 阅读: 评论:0

本文总结了一套与java函数相关的编码规则,旨在给广大java程序员一些编码建议,有助于大家编写出更优雅、更高质、更高效的代码。

上文链接:link

内部函数参数尽量使用基础类型

案例一:内部函数参数尽量使用基础类型

现象描述:

// 调用代码double price = 5.1d;int number = 9;double total = calculate(price, number);// 计算金额函数private double calculate(double price, integer number) { return price * number;}

建议方案:

// 调用代码double price = 5.1d;int number = 9;double total = calculate(price, number);// 计算金额函数private double calculate(double price, int number) { return price * number;}

案例二:内部函数返回值尽量使用基础类型

现象描述:

// 获取订单总额函数public double getorderamount(list<product> productlist) { double amount = 0.0d; for (product product : productlist) { if (objects.isnull(product) || objects.isnull(product.getprice()) || objects.isnull(product.getnumber())) { continue; } amount += calculate(product.getprice(), product.getnumber()); } return amount;}// 计算金额函数private double calculate(double price, double number) { return price * number;}

建议方案:

// 获取订单总额函数public double getorderamount(list<product> productlist) { double amount = 0.0d; for (product product : productlist) { if (objects.isnull(product) || objects.isnull(product.getprice()) || objects.isnull(product.getnumber())) { continue; } amount += calculate(product.getprice(), product.getnumber()); } return amount;}// 计算金额函数private double calculate(double price, double number) { return price * number;}

此处只是举例说明这种现象,更好的方式是采用流式(stream)编程。

主要收益

内部函数尽量使用基础类型,避免了隐式封装类型的打包和拆包;内部函数参数使用基础类型,用语法上避免了内部函数的参数空指针判断;内部函数返回值使用基础类型,用语法上避免了调用函数的返回值空指针判断。

尽量避免返回的数组和列表为null

案例一:尽量避免返回的数组为null,引起不必要的空指针判断

现象描述:

// 调用代码urvo[] urs = queryur();if (objects.nonnull(urs)) { for (urvo ur : urs) { // 处理用户信息 }}// 查询用户函数private urvo[] queryur() { // 查询用户列表 list<urdo> urlist = urdao.queryall(); if (collectionutils.impty(urlist)) { return null; } // 转化北上广不相信眼泪主题曲用户数组 urvo[] urs = new urvo[urlist.size()]; for (int i = 0; i < urlist.size(); i++) { urdo ur = urlist.get(i); urs[i] = new urvo(); urs[i].tid(ur.getid()); urs[i].tname(ur.getname()); } // 返回用户数组 return urs;}

建议方案:

// 调用代码urvo[] urs = queryur();for (urvo ur : urs) { // 处理用户信息}// 查询用户函数private urvo[] queryur() { // 查询用户列表 list<urdo> urlist = urdao.queryall(); if (collectionutils.impty(urlist)) { return new urvo[0]; } // 转化用户数组 urvo[] urs = new urvo[urlist.size()]; for (int i = 0; i < urlist.size(); i++) { urdo ur = urlist.get(i); urs[i] = new urvo(); urs[i].tid(ur.getid()); urs[i].tname(ur.getname()); } // 返回用户数组 return urs;}

案例二:尽量避免返回的列表为null,引起不必要的空指针判断

现象描述:

学生特长// 调用代码list<urvo> urlist = queryur();if (objects.nonnull(urlist)) { for (urvo ur : urlist) { // 处理用户信息 }}// 查询用户函数private list<urvo> queryur(){ // 查询用户列表 list<urdo> urlist = urdao.queryall(); if(collectionutils.impty(urlist)) { return null; } // 转化用户列表 list<urvo> urvolist = new arraylist<>(urlist.size()); for(urdo ur : urlist) { urvo urvo = new urvo(); urvo.tid(ur.getid()); urvo.tname(ur.getname()); urvolist.add(urvo); } // 返回用户列表 return urvolist;}

建议方案:

// 调用代码list<urvo> urlist = queryur();for (urvo ur : urlist) { // 处理用户信息 }// 查询用户函数private list<urvo> queryur(){ // 查询用户列表 list<urdo> urlist = urdao.queryall(); if(collectionutils.impty(urlist)) { return collections.emptylist(); } // 转化用户列表 list<urvo> urvolist = new arraylist<>(urlist.size()); for(urdo ur : urlist) { urvo urvo = new urvo(); urvo.tid(ur.getid()); urvo.tname(ur.getname()); urvolist.add(urvo); } // 返回用户列表 return urvolist;}

主要收益

保证返回的数组和列表不为null, 避免调用函数的空指针判断。

封装函数传入参数

案例一:当传入参数过多时,应封装为参数类

java规范不允许函数参数太多,不便于维护也不便于扩展。

现象描述:

// 修改用户函数public void modifyur(long id, string name, string phone, integer age,  integer x, string address, string description) { // 具体实现逻辑}

建议方案:

// 修改用户函数public void modifyur(ur ur) { // 具体实现内容}// 用户类@getter@tter@tostringprivate class ur{ private long id; private string name; private string phone; private integer age; private integer x; private string address; private string description;}

当传入成组参数时,应封装为参数类

既然参数成组出现,就需要封装一个类去描述这种现象。

现象描述:

// 获取距离函数public double getdistance(double x1, double y1, double x2, double y2) { // 具体实现逻辑}

建议方案:

// 获取距离函数public double getdistance(point point1, point point2) { // 具体实现逻辑}// 点类@getter@tter@tostringprivate class point{ private double x; private double y;}

主要收益

封装过多函数参数为类,使函数更便于扩展和维护;封装成组函数参数为类,使业务概念更明确更清晰。

尽量用函数替换匿名内部类的实现

java匿名内部类的优缺点:

在匿名内部类(包括lambda表达式)中可以直接访问外部类的成员,包括类的成员变量、函数的内部变量。正因为可以随意访问外部变量,所以会导致代码边界不清晰。

首先推荐用lambda表达式简化匿名内部类,其次推荐用函数替换复杂的lambda表达式的实现。

案例一:尽量用函数替换匿名内部类(包括lambda表达式)的实现

现象描述:

// 发送结算数据ndworkerttledata(workerpushdatatype.checker, () -> { date begindate = dateutils.adddays(currdate, -aheaddays); date enddate = dateutils.adddays(currdate, 1); return audittaskdao.statcheckerttledata(begindate, enddate);});

建议方案:

// 发送结算数据ndworkerttledata(workerpushdatatype.checker, () -> statcheckerttledata(currdate, aheaddays));// 统计验收员结算数据函数private list<workerttledata> statcheckerttledata(date currdate, int aheaddays) { date begindate = dateutils.adddays(currdate, -aheaddays); date enddate = dateutils.adddays(currdate, 1); return audittaskdao.statcheckerttledata(begindate, enddate);}

其实,还有一个更简单的办法。在调用函数ndworkerttledata(发送作业员结算数据)之前计算开始日期、结束日期,就直接可以用函数
audittaskdao.statcheckerttledata(begindate, enddate)代替匿名内部类实现。

案例二:拆分复杂匿名内部类实现接口为多个函数类接口

如果一个匿名内部类实现的接口几个函数间关联性不大,可以把这个接口拆分为几个函数式接口,便于使用lambda表达式。

现象描述:

// 清除过期数据cleanexpireddata("用户日志表", new cleanexpireddataoperator() { @override public list<date> queryexpireddate汉字歇后语(integer remaindays) { return urdao.queryexpireddate(remaindays); } @override public void cleanexpireddata(date expireddate) { urdao.cleanexpireddata(expireddate); }});// 清除过期数据函数private void cleanexpireddata(string tablename, cleanexpireddataoperator ,cleanexpireddataoperator) { // 功能实现代码}// 清除过期操作接口interface cleanexpireddataoperator { // 查询过期日期 public list<date> queryexpireddate(integer remaindays); // 清除过期数据 public void cleanexpireddata(date expireddate);}

建议方案:

// 清除过期数据cleanexpireddata("用户日志表", urdao::queryexpireddate,urdao::cleanexpireddata);// 清除过期数据函数private void cleanexpireddata(string tablename, queryexpireddateoperator queryexpireddateoperator, cleanexpireddataoperator cleanexpireddataoperator) { // 功能实现代码}// 查询过期日期接口interface queryexpireddateoperator { // 查询过期日期 public list<date> queryexpireddate(integer remaindays);}// 清除过期操作接口interface cleanexpireddataoperator { // 清除过期数据 public void cleanexpireddata(date expireddate);}

主要收益

定义函数并指定参数,明确规定了匿名内部类的代码边界;利用lambda表达式简化匿名内部类实现,使代码更简洁。

利用return精简不必要的代码

案例一:删除不必要的if

现象描述:

// 是否通过函数public boolean ispasd(double passrate) { if (objects.nonnull(passrate) && passrate.compareto(pass_threshold) >= 0) { return true; } return fal;}

建议方案:

// 是否通过函数public boo改革创新的例子lean ispasd(double passrate) { return objects.nonnull(passrate) && passrate.compareto(pass_threshold) >= 0;}

案例二:删除不必要的el

现象描述:

// 结算工资函数public double ttlesalary(long workid, int workdays) { // 根据是否合格处理 if (isqualified(workid)) { return ttlequalifiedsalary(workdays); } el { return ttleunqualifiedsalary(workdays); }}

建议方案:

// 结算工资函数public double ttlesalary(long workid, int workdays) { // 根据是否合格处理 if (isqualified(workid)) { return ttlequalifiedsalary(workdays); } return ttleunqualifiedsalary(workdays);}

案例三:删除不必要的变量

现象描述:

// 查询用户函数public list<urdo> queryur(long id, string name) { urquery urquery = new urquery(); urquery.tid(id); urquery.tname(name); list<urdo> urlist = urdao.query(urquery); return urlist;}

建议方案:

// 查询用户函数public list<urdo> queryur(long id, string name) { urquery urquery = new urquery(); urquery.tid(id); urquery.tname(name); return urdao.query(urquery);}

主要收益

精简不必要的代码,让代码看起来更清爽

利用临时变量优化代码

在一些代码中,经常会看到a.getb().getc()…getn()的写法,姑且叫做“函数的级联调用”,代码健壮性和可读性太差。建议:杜绝函数的级联调用,利用临时变量进行拆分,并做好对象空指针检查。

案例一:利用临时变量厘清逻辑

现象描述:

// 是否土豪用户函数private boolean isrichur(ur ur) { return objects.nonnull(ur.getaccount()) && objects.nonnull(ur.getaccount().getbalance()) && ur.getaccount().getbalance().compareto(rich_threshold) >= 0;}

这是精简代码控的最爱,但是可读性实在太差。

建议方案:

// 是否土豪用户函数private boolean isrichur(ur ur) { // 获取用户账户 uraccount account = ur.getaccount(); if (objects.isnull(account)) { return fal; } // 获取用户余额 double balance = account.getbalance(); if (objects.isnull(balance)) { return fal; } // 比较用户余额 return balance.compareto(rich_threshold) >= 0;}

这个方案,增加了代码行数,但是逻辑更清晰。

有时候,当代码的精简性和可读性发生冲突时,个人更偏向于保留代码的可读性。

案例二:利用临时变量精简代码

现象描述:

// 构建用户函数public urvo buildur(urdo ur) { urvo vo = new urvo(); vo.tid(ur.getid()); vo.tname(ur.getname()); if (objects.nonnull(ur.getaccount())) { vo.tbalance(ur.getaccount().getbalance()); vo.tdebt(ur.getaccount().getdebt()); } return vo;}

这么写,大约是为了节约一个临时变量把。

建议方案:

// 构建用户函数public urvo buildur1(urdo ur) { urvo vo = new urvo(); vo.tid(ur.getid()); vo.tname(ur.getname()); uraccount account = ur.getaccount(); if (objects.nonnull(account)) { vo.tbalance(account.getbalance()); vo.tdebt(account.getdebt()); } return vo;}

主要收益

利用临时变量厘清逻辑,显得业务逻辑更清晰;利用临时变量精简代码,看变量名称即知其义,减少了大量无用代码;如果获取函数比较复杂耗时,利用临时变量可以提高运行效率;利用临时变量避免函数的级联调用,可有效预防空指针异常。

仅保留函数需要的参数

在一些代码中,经常会看到a.getb().getc()…getn()的写法,姑且叫做“函数的级联调用”,代码健壮性和可读性太差。建议:杜绝函数的级联调用,利用临时变量进行拆分,并做好对象空指针检查。

案例一:删除多余的参数

现象描述:

// 修改用户状态函数private void modifyurstatus(long urid, integer status, string unud) { urcache.modifystatus(urid, status); urdao.modifystatus(urid, status);}其中,unud参数是无用参数。建议方案:// 修改用户状态函数private void modifyurstatus(long urid, integer status) { urcache.modifystatus(urid, status); urdao.modifystatus(urid, status);}

案例二:用属性取代对象

现象描述:

// 删除用户函数private void deleteur(ur ur) { urcache.delete(ur.geti完美英文d()); urdao.delete(ur.getid());}

建议方案:

// 删除用户函数private void deleteur(long urid) { urcache.delete(urid); urdao.delete(urid);}

建议方案:

调用函数时,参数对象不需要专门构建,而函数使用其属性超过3个,可以不必使用该规则。

主要收益

仅保留函数需要的参数,明确了调用时需要赋值的参数,避免了调用时还要去构造些无用参数。

后记

“众人拾柴火焰高”。如果有更多更好的观点,亦或有更好的代码案例,欢迎大家进行补充说明。笔者希望以此文抛砖引玉,如果最终形成一套完善的java编码规范,善莫大焉。

本文发布于:2023-04-05 04:36:49,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/4a58fc0325c0d46272e30aeaab16bc80.html

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

本文word下载地址:java编码规范有哪些(阿里巴巴java编码规范).doc

本文 PDF 下载地址:java编码规范有哪些(阿里巴巴java编码规范).pdf

标签:函数   代码   用户   参数
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图