面向对象:

ü 构造器参数太多怎么办(5个以上)?

使用构造者模式(build),

package com.xiangxue.ch04.builder01;public class FoodBuilder {//requiredprivate final String foodName;private final int reilang;//optionalprivate  int danbz;private  int dianfen;private  int zf;private  int tang;private   int wss;public static class Builder{//requiredprivate final String foodName;private final int reilang;//optionalprivate  int danbz;private  int dianfen;private  int zf;private  int tang;private   int wss;public Builder(String foodName, int reilang) {super();this.foodName = foodName;this.reilang = reilang;}public Builder danbz(int val) {this.danbz = val;return this;}//.......public FoodBuilder build() {return new FoodBuilder(this);}}private FoodBuilder(Builder builder) {foodName = builder.foodName;reilang = builder.reilang;danbz = builder.danbz;//.....}public static void main(String[] args) {FoodBuilder foodBuilder = new FoodBuilder.Builder("food2", 1000).danbz(100)//......build();}
}

抽象构造:

package com.xiangxue.ch04.builder01.buildpattern;/***类说明:客户端*/
public class Mingyun {public static void main(String[] args) {System.out.println("create NvWa");NvWa nvwa =  new NvWa();nvwa.buildPerson(new ManBuilder());nvwa.buildPerson(new WomanBuilder());}
}
package com.xiangxue.ch04.builder01.buildpattern;import com.xiangxue.ch04.builder01.buildpattern.product.Person;/***类说明:导演者*/
public class NvWa {public Person buildPerson(PersonBuilder pb) {pb.buildHead();pb.buildBody();pb.buildFoot();return pb.createPerson();}}
package com.xiangxue.ch04.builder01.buildpattern;import com.xiangxue.ch04.builder01.buildpattern.product.Man;
import com.xiangxue.ch04.builder01.buildpattern.product.Person;/***类说明:具体建造者*/
public class ManBuilder extends PersonBuilder {private Person person;public ManBuilder() {this.person = new Man();}@Overridepublic void buildHead() {person.setHead("Brave Head");}@Overridepublic void buildBody() {person.setBody("Strong body");}@Overridepublic void buildFoot() {person.setFoot("powful foot");}@Overridepublic Person createPerson() {return person;}
}
package com.xiangxue.ch04.builder01.buildpattern;import com.xiangxue.ch04.builder01.buildpattern.product.Person;/***类说明:抽象建造者*/
public abstract class PersonBuilder {//建造部件public abstract void buildHead();public abstract void buildBody();public abstract void buildFoot();public abstract Person createPerson();}
package com.xiangxue.ch04.builder01.buildpattern;import com.xiangxue.ch04.builder01.buildpattern.product.Person;
import com.xiangxue.ch04.builder01.buildpattern.product.Woman;/***类说明:具体建造者*/
public class WomanBuilder extends PersonBuilder {private Person person;public WomanBuilder() {this.person = new Woman();}@Overridepublic void buildHead() {person.setHead("Pretty Head");}@Overridepublic void buildBody() {person.setBody("soft body");}@Overridepublic void buildFoot() {person.setFoot("long white foot");}@Overridepublic Person createPerson() {return person;}}
package com.xiangxue.ch04.builder01.buildpattern.product;/***类说明:具体的产品*/
public class Man extends Person {public Man() {System.out.println("create a man");}@Overridepublic String toString() {return "Man{}";}
}
package com.xiangxue.ch04.builder01.buildpattern.product;/***类说明:产品类,抽象的*/
public abstract class Person {protected String head;protected String body;protected String foot;public String getHead() {return head;}public void setHead(String head) {this.head = head;}public String getBody() {return body;}public void setBody(String body) {this.body = body;}public String getFoot() {return foot;}public void setFoot(String foot) {this.foot = foot;}
}
package com.xiangxue.ch04.builder01.buildpattern.product;/***类说明:具体的产品*/
public class Woman extends Person {public Woman() {System.out.println("create a Woman");}@Overridepublic String toString() {return "Woman{}";}
}

不需要实例化的类应该构造器私有

如:工具类

不要创建不必要的对象

package com.xiangxue.ch04.createobj03;public class Sum {public static void main(String[] args) {long start = System.currentTimeMillis();Long sum = 0L;//对象for(long i=0;i<Integer.MAX_VALUE;i++) {sum = sum+i;//new 20多亿的Long的实例}System.out.println("spend time:"+(System.currentTimeMillis()-start)+"ms");}
}

Long sum = 0L;改为long sum时,花费时间就很少,因为每次sum = sum+i;时就new出了一个新对象。

避免使用终结方法


Finalize方法就算代码里写了,也不一定会被jdk调用;
ü 使类和成员的可访问性最小化
ü 使可变性最小化
ü 优先使用复合

继承:

package com.xiangxue.ch04.countset07;import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;/***类说明:统计增加的元素个数,继承*/
public class ExtendsHashSet<E> extends HashSet<E> {private int addCount = 0;//计数器public ExtendsHashSet() {}@Overridepublic boolean add(E e) {addCount++;return super.add(e);}@Overridepublic boolean addAll(Collection<? extends E> c) {addCount = addCount+c.size();return super.addAll(c);}public int getAddCount() {return addCount;}public static void main(String[] args) {ExtendsHashSet<String> s = new ExtendsHashSet<String>();s.addAll(Arrays.asList("Mark","James","Lison"));System.out.println(s.getAddCount());  // 结果为6,addAll调用了add方法}
}

组合:

package com.xiangxue.ch04.countset07;import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;/***类说明:统计增加的元素个数,组合*/
public class CompositionSet<E>{private int addCount = 0;private final Set<E> s;public int getAddCount() {return addCount;}public CompositionSet(Set<E> s) {super();this.s = s;}public boolean add(E e) {addCount++;return s.add(e);}public boolean addAll(Collection<? extends E> c) {addCount = addCount+c.size();return s.addAll(c);}public static void main(String[] args) {CompositionSet<String> s = new CompositionSet<>(new HashSet<String>());s.addAll(Arrays.asList("Mark","James","Lison"));System.out.println(s.getAddCount()); // 结果为3}
}


方法

可变参数要谨慎使用

可变参数允许传0个参数;
package com.xiangxue.ch04.varargs09;import java.util.Collections;import com.xiangxue.ch04.enmu12.SampleIntConst;public class VarArags {//private User user ;public static void userOper(int count) {//SampleIntConst.ORDER_DEPOT_PAID;if (count<0) {throw new IllegalArgumentException("");}}//可能很多 0~很多static int sum(int... args) {int sum = 0;for (int arg : args)sum += arg;return sum;}//要求参数的个数,是1~多个//
//  static int sum1(int... args) {//      if(args.length==0) {//          //做点异常处理
//      }
//      if(args[0]==100) {//
//      }
//      for(int i=1;i<args.length;i++) {//          int sum = 0;
//          sum += args[i];
//          return sum;
//      }
//  }
//
//  static int sum2(int flag, int... args) {//      if(flag==100) {//
//      }
//      int sum = 0;
//      for (int arg : args)
//          sum += arg;
//      return sum;
//      return Collections.EMPTY_LIST;
//  }}

返回零长度的数组或集合,不要返回null

集合可以返回这个:
return Collections.EMPTY_LIST;

优先使用标准的异常

public static void userOper(int count) {//SampleIntConst.ORDER_DEPOT_PAID;if (count<0) {throw new IllegalArgumentException("");}
}


此处,子类应该重写该方法,然后子类调用自己重写后的方法,如果子类没有重写,就会调用到父类的该方法,此时,父类抛出异常。

通用程序设计

用枚举代替int 常量

package com.xiangxue.ch04.enmu12;public class SampleIntConst {//延时订单状态public static final int ORDER_DEPOT_UNPAY = 0;//public static final String ORDER_DEPOT_UNPAY_DESC = "unpay";public static final int ORDER_DEPOT_PAID = 3;public static final int ORDER_DEPOT_TIMOUT = 2;//物流订单状态public static final int ORDER_LOGISTICS_READY = 0;public static final int ORDER_LOGISTICS_TRANSPORT = 1;public static final int ORDER_LOGISTICS_ARRIVED = 2;//public enum Depot{UNPAY,PAID,TIMOUT}//0,1,2public enum Logistics{READY,TRANSPORT,ARRIVED}public static void main(String[] args) {System.out.println(Depot.UNPAY);System.out.println(Depot.UNPAY.ordinal());
//      if(==0)
//          switch status
//          case 0:}
}

写代码时可能会写错,调用该常亮时,订单的状态常量可能使用到库存的状态常量,只是常量名有变化,如果没有仔细看,就over了。

package com.xiangxue.ch04.enmu12;public enum DepotEnum {UNPAY(0,"未支付"),PAID(1,"已支付"),TIMOUT(-1,"超时");private int status;private String desc;private String dbInfo;//其他属性private DepotEnum(int status, String desc) {this.status = status;this.desc = desc;}public int getStatus() {return status;}public String getDesc() {return desc;}public String getDbInfo() {return dbInfo;}public int calcStatus(int params) {return status+params;}public static void main(String[] args) {for(DepotEnum e:DepotEnum.values()) {System.out.println(e+":"+e.calcStatus(14));}}
}

枚举和行为绑定:

package com.xiangxue.ch04.enmu12;/***类说明:枚举和行为绑定*/
public class ActiveEnum {public enum NormalActive{PLUS,MINUS,MULTI,DIVIDS,DIFFER;double oper(double x,double y) {switch(this) {case PLUS:return x+y;case MINUS:return x-y;case MULTI:return x*y;case DIVIDS:return x/y;}throw new UnsupportedOperationException();}        }public enum BetterActive{PLUS {@Overridedouble oper(double x, double y) {return x+y;}},MINUS {@Overridedouble oper(double x, double y) {return x-y;}};abstract double oper(double x,double y);//        double oper(double x,double y) {//          switch(this) {//          case PLUS:return x+y;
//          case MINUS:return x-y;
//          case MULTI:return x*y;
//          case DIVIDS:return x/y;
//
//          //default:
//          }
//          throw new UnsupportedOperationException();
//      }       }public static void main(String[] args) {System.out.println(NormalActive.PLUS.oper(0.1, 0.2));}}
//计算加班费:
package com.xiangxue.ch04.enmu12;/***类说明:加班费计算,工作日加班2倍,节假日3倍*/
enum PayDay {MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY,WUYI;private static final int HOURS_WORK = 2;private static final int HOURS_REST = 3;//超时时间double pay(double hoursOvertime) {switch(this) {case SATURDAY:case SUNDAY:return hoursOvertime*HOURS_REST;default:return hoursOvertime*HOURS_WORK;}}
}
//策略枚举:
package com.xiangxue.ch04.enmu12;
/***类说明:加班费计算,工作日加班2倍,节假日3倍*/
public enum BetterPayDay {MONDAY(PayType.WORK), TUESDAY(PayType.WORK), WEDNESDAY(PayType.WORK), THURSDAY(PayType.WORK), FRIDAY(PayType.WORK), SATURDAY(PayType.REST), SUNDAY(PayType.REST),WUYI(PayType.REST);private final PayType payType;//成员变量BetterPayDay(PayType payType) {this.payType = payType;}double pay(double hoursOvertime) {return payType.pay(hoursOvertime);}//策略枚举private enum PayType {WORK {double pay(double hoursOvertime) {return hoursOvertime*HOURS_WORK;}},REST {double pay(double hoursOvertime) {return hoursOvertime*HOURS_REST;}};private static final int HOURS_WORK = 2;private static final int HOURS_REST = 3;abstract double pay(double hoursOvertime);//抽象计算加班费的方法}public static void main(String[] args) {System.out.println(BetterPayDay.MONDAY.pay(7.5));}
}

将局部变量的作用域最小化

精确计算,避免使用float 和double

当心字符串连接的性能

package com.xiangxue.ch04.StringUnion15;public class Test {private static class Log{public static void debug(String msg){if (isDebug()) System.out.println(msg);}public static boolean isDebug(){return false;}}public static void main(String[] args) {int count = 100000000;long start = System.currentTimeMillis();
//        StringBuiler
//        StringBuffer;
//        "a"+"b"+"";for(int i = 0;i<count;i++){Log.debug("The system is running and the time is "+System.currentTimeMillis()+" now,Let's do another thing:"+System.nanoTime());}System.out.println("直接打印模式,次数:"+count+":spend time :"+(System.currentTimeMillis()-start)+"ms");start = System.currentTimeMillis();for(int i = 0;i<count;i++){if(Log.isDebug())Log.debug("The system is running and the time is "+System.currentTimeMillis()+" now,Let's do another thing:"+System.nanoTime());}System.out.println("先判断再打印模式,次数:"+count+":spend time :"+(System.currentTimeMillis()-start)+"ms");}
}


控制方法的大小

JVM性能调优5_编写高效优雅Java程序__享学课堂相关推荐

  1. 如何编写高效优雅 Java 程序

    文章目录 编写高效优雅 Java 程序 面向对象 01.构造器参数太多怎么办? Builder 模式: 02.不需要实例化的类应该构造器私有 03.不要创建不必要的对象 04.避免使用终结方法 05. ...

  2. Mr. Cappuccino的第19杯咖啡——金三银四面试题之JVM性能调优篇

    金三银四面试题之JVM性能调优篇 1. 什么是Java类加载器? 2. 读取class文件的来源有哪些? 3. 谈谈类加载器加载的流程? 4. 类加载器有哪几种? 5. 哪些操作会初始化类加载器? 6 ...

  3. 第七篇:双管齐下,JVM内部优化与JVM性能调优

    文章目录 一.前言 二.编译时优化 2.1 Javac编译器 2.2 Java语法糖 2.2.1 泛型和泛型擦除 2.2.2 自动装箱.自动拆箱.遍历循环 2.2.3 条件编译 三.运行时优化(核心: ...

  4. JVM性能调优监控工具jps、jstack、jmap、jhat、jstat、hprof使用详解 | 必须收藏!

    点击蓝色"程序猿DD"关注我 回复"资源"获取独家整理的学习资料! 作者 | 优雅先生 来源 | my.oschina.net/feichexia/blog/1 ...

  5. 【JVM性能调优】jstack和线程dump分析

    一.几个概念: 1.jstack命令的语法格式:jstack <pid>,可用于查看java进程id. 2.Dump文件:Dump文件是进程的内存镜像.可以把程序的执行状态通过调试器保存到 ...

  6. JVM性能调优实践:G1 垃圾收集器介绍篇

    前言 前面两篇主要整理了性能测试的主要观察指标信息:性能测试篇,以及JVM性能调优的工具:JVM篇.这一篇先简单总结一下GC的种类,然后侧重总结下G1(Garbage-First)垃圾收集器的分代,结 ...

  7. 服务器优化:Tomcat、JVM性能调优笔记

    找到Tomcat根目录下的conf目录,修改server.xml文件的内容.对于这部分的调优,我所了解到的就是无非设置一下Tomcat服务器的最大并发数和Tomcat初始化时创建的线程数的设置,当然还 ...

  8. 如何合理的规划一次 JVM 性能调优

    转载自   如何合理的规划一次 JVM 性能调优 摘要: JVM性能调优涉及到方方面面的取舍,往往是牵一发而动全身,需要全盘考虑各方面的影响,那么如何进行一次优雅的调优,提升应用的性能? 这是 JVM ...

  9. JVM性能调优(一)

    作者 Eva Andreasson  译者:赵峰 校对:方腾飞  原文链接 Java应用程序是运行在JVM上的,但是你对JVM技术了解吗?这篇文章(这个系列的第一部分)讲述了经典Java虚拟机是怎么样 ...

最新文章

  1. Kubernetes数据持久化方案
  2. 配置Windows下编译运行C/C++过程
  3. Java Spring源代码学习之how is bean scanned - did not answer when this.beanDefinitionNames is filled
  4. md5字符串输入c语言,请问C语言怎么实现对一长串字符进行MD5加密?
  5. SQL Server - 高可用与灾难恢复(HADR)技术 -- AlwaysOn可用性组(理论篇)
  6. python的excel库_Python-Excel 模块哪家强?
  7. C语言中函数调用中的传值与传址
  8. 微软公布针对最新IE漏洞的安全通报2963983
  9. 【学习笔记】常用的c/c++面试题
  10. 【Unity】unity3d客户端网络框架
  11. 计算机关闭窗口可以使用alt,电脑关闭窗口快捷键
  12. 计算机自检后反复重启 主引导,电脑重装系统时,按错了意外重启然后就一直这样怎么办啊!...
  13. Flutter获取网络图片:The following SocketException was thrown resolving an image codec:
  14. 跨境电商ERP系统基础开发教程
  15. ERP编制物料清单 金蝶
  16. 斐波那契查找(黄金分割法)超详细详解
  17. Android框架排行榜,上百项资源汇总不容错过
  18. Spring Cloud 项目实战 Jenkins 实现 CI/CD 你需要的这里都有
  19. 表情包系列(一):程序员专属的可爱搞笑表情包+段子,进来看一看......
  20. Openssl 建立双向认证的 SSL/TLS 通信

热门文章

  1. 关于在线评论有用性的论文研读笔记---41-50篇
  2. MySQL之DML常用命令
  3. pythonapi是什么意思_python中api是什么
  4. leecode:977. 有序数组的平方
  5. 曲终人散,弦断花落,许梦尘埃落定
  6. 全排列,逆序数与行列式的二三事
  7. bzoj2676 Contra
  8. android底层之什么是Zram?
  9. Windows系统安装jdk17
  10. 良心的vscode主题推荐