stringbuffer有限制吗_你的代码优化了吗?分享一波七个优化代码的小技巧

*2019 BAT必备——JVM面试必问(附答案)

*我说精通字符串,面试官竟然问我Java中的String有没有长度限制?

*国内Java面试总是问StringBuffer?档次为什么这么低?

*字节跳动的面试难吗?我该如何应对?

5afa09bb9741240fdbb11589efd9683f.png

01 提炼函数(适当抽取小函数)

1.1 定义

提炼函数就是将一段代码放进一个独立函数中,并让函数名称解释该函数用途。

一个过于冗长的函数或者一段需要注释才能让人理解用途的代码,可以考虑把它切分成一个功能明确的函数单元,并定义清晰简短的函数名,这样会让代码变得更加优雅。

1.2 优化例子

(1)提炼函数之前

 private String name; private Vector orders = new Vector(); public void printOwing() { //print banner System.out.println("****************"); System.out.println("*****customer Owes *****"); System.out.println("****************"); //calculate totalAmount Enumeration env = orders.elements(); double totalAmount = 0.0; while (env.hasMoreElements()) { Order order = (Order) env.nextElement(); totalAmount += order.getAmout(); } //print details System.out.println("name:" + name); System.out.println("amount:" + totalAmount); }

(2)提炼函数之后

以上那段代码,可以抽成print banner,calculate totalAmount,print details三个功能的单一函数,如下:

 private String name; private Vector orders = new Vector(); public void printOwing() {  //print banner printBanner(); //calculate totalAmount double totalAmount = getTotalAmount(); //print details printDetail(totalAmount); } void printBanner(){ System.out.println("****************"); System.out.println("*****customer Owes *****"); System.out.println("****************"); } double getTotalAmount(){ Enumeration env = orders.elements(); double totalAmount = 0.0; while (env.hasMoreElements()) { Order order = (Order) env.nextElement(); totalAmount += order.getAmout(); } return totalAmount; } void printDetail(double totalAmount){ System.out.println("name:" + name); System.out.println("amount:" + totalAmount); }

02 内联函数(适当去除多余函数)

2.1 定义

内联函数就是在函数调用点插入函数本体,然后移除该函数。

上一小节介绍了提炼函数代码优化方式,以简短清晰的小函数为荣。但是呢,小函数是不是越多越好呢?肯定不是啦,有时候你会遇到某些函数,其内部代码和函数名称同样清晰,这时候呢你可以考虑内联函数优化一下了。

2.2 优化例子

(1)内联函数之前

 int getRating(){ return moreThanFiveDeliveries() ? 2 : 1; } boolean moreThanFiveDeliveries(){ return numberOfLateDeliveries >5; }

(2)内联函数之后

 int getRating(){ return numberOfLateDeliveries >5 ? 2 : 1; }

03 内联临时变量(去除多余临时变量)

3.1 定义

内联临时变量将所有对该变量的引用动作,替换为对它赋值的那个表达式自身。

3.2 优化例子

(1)内联临时变量之前

double basePice = anOrder.basePrice();return basePice >888;

(2)内联临时变量之后

 return anOrder.basePrice() >888;

04 引入解释性变量

4.1 定义

引入解释性变量 就是将该复杂表达式(或其中一部分)的结果放进一个临时变量,以此变量名称来解释表达式用途。

有些表达式可能非常复杂难于阅读,在这种情况下,临时变量可以帮助你将表达式分解为可读的形式。

在比较复杂的条件逻辑中,你可以用引入解释性变量将每个条件子句提炼出来,以一个良好命名的临时变量来解释对应条件子句的意义。

4.2 优化例子

(1)引入解释性变量之前

if ((platform.toUpperCase().indexOf("mac") > -1) && (brower.toUpperCase().indexOf("ie") > -1) && wasInitializes() && resize > 0) { ...... }

(2)引入解释性变量之后

final boolean isMacOS = platform.toUpperCase().indexOf("mac") > -1;final boolean isIEBrowser = brower.toUpperCase().indexOf("ie") > -1;final boolean wasResized = resize > 0;if (isMacOS && isIEBrowser && wasInitializes() && wasResized) { ......}

05 以字面常量取代魔法数

5.1 定义

创造一个常量,根据其意义为它命名,并将上述的字面数值替换为这个常量。

所谓魔法数是指拥有特殊意义,却又不能明确表现出这种意义的数字。如果你需要在不同的地点引用同一个逻辑数,每当该数字要修改时,会特别头疼,因为很可能会改漏。而字面常量取代魔法数可以解决这个头疼问题。

5.2 优化例子

(1)以字面常量取代魔法数之前

double getDiscountPrice(double price){ return price * 0.88; }

(2)以字面常量取代魔法数之后

 static final double DISCOUNT_CONSTANT=0.88;  double getDiscountPrice(double price){ return price * DISCOUNT_CONSTANT; }

06 用多态替代switch语句

6.1 定义

用多态替换switch语句 就是利用Java面向对象的多态特点,使用state模式来替换switch语句。

6.2 优化例子

(1)用多态替换switch语句之前

 int getArea() { switch (shape){ case SHAPE.CIRCLE: return 3.14 * _r * _r; break; case SHAPE.RECTANGEL; return width *,heigth; } }

(2)用多态替换switch语句之后

 class Shape { int getArea(){}; } class Circle extends Shape { int getArea() { return 3.14 * r * r;  } } class Rectangel extends Shape { int getArea() { return width * heigth; } }

07 将过多的参数对象化

7.1 定义

将过多的参数对象化就是把涉及过多参数封装成一个对象传参。

一个方法有太多传参时,即难以阅读又难于维护。尤其针对dubbo远程调用这些方法,如果有过多参数,增加或者减少一个参数,都要修改接口,真的坑。如果把这些参数封装成一个对象,就很好维护了,不用修改接口。

7.2 优化例子

(1)将过多的参数对象化之前:

public int register(String username,String password,Integer age,String phone);

(2)将过多的参数对象化之后:

 public int register(RegisterForm from );  class RegisterForm{ private String username; private String password; private Integer age; private String phone; }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值