首页 > 编程语言 >Effective Java-1.考虑使用静态工厂方法代替构造方法

Effective Java-1.考虑使用静态工厂方法代替构造方法

时间:2022-12-13 14:24:45浏览次数:51  
标签:返回 Java 构造方法 Effective 静态 工厂 实例 方法

静态工厂方法的优点

  • 不像构造方法,静态工厂是有名字的
    • 精心构造的名称使得静态工厂方法更容易使用和理解,即知道创建的是什么对象
  • 与构造方法不同,不用每次都创建一个新的对象
    • 可以使用不可变类预先构建实例
    • 可以在构造时缓存实例
    • 类似于享元模式,可以极大提供性能
    • 实例控制。对于实例的创建和使用有严格的控制
  • 可以返回类型的任何子类型,更具灵活性
    • 灵活:API可以返回它的对象但是并不公开它的类,隐藏了实现类
    • JDK大量使用,如Collection接口的伙伴类Collections
    • JDK8后可以在接口中使用静态方法
  • 返回对象的类可以根据输入参数的不同而不同
    • 例子:EnumSet类,底层可以枚举类型的大小返回不同类型的实例,优化性能。后期也可以方便对实例的类型进行淘汰或者更新,不会影响客户端代码
  • 在编写包含该方法的类时,返回的对象的类不需要存在
    • 服务提供框架的基础,JDK通用服务提供框架:java.util.ServiceLoader
      静态工厂方法的缺点:
  • 没有公共或受保护构造方法的类不能被子类化
    • 不过因祸得福,鼓励使用组合而非继承
  • 程序员很难找到它们
    • 提供一个静态工厂方法的常用名称
    • 方法名 说明 示例
      from 类型转换方法,它接受单个参数并返回此类型的相应实例 Date d = Date.from(instant)
      of 聚合方法,接收多个参数返回该类型实例,并把它们合并在一起 Set<Rank> faceCards = EnumSet.of(JACK, QUEEN, KING)
      valueof fromto更为详细的替代方式 BigInteger prime = BigInteger.valueOf(Integer.MAX_VALUE)
      instance & getInstance 返回一个由其参数(如果有的话)描述的实例,但不能说它具有相同的值 StackWalker luke = StackWalker.getInstance(options)
      create & newInstence instancegetInstance有些类似,除了该方法保证每个调用返回一个新的实例 Object newArray = Array.newInstance(classObject, arrayLen)
      getType getInstance类似,但是如果在工厂方法中不同的类中使用。Type是工厂方法返回的对象类型 FileStore fs = Files.getFileStore(path)
      newType newInstance类似,但是如果在工厂方法中不同的类中使用。Type是工厂方法返回的对象类型 BufferedReader br = Files.newBufferedReader(path)
      type getTypenewType简洁的替代方式 List<Complaint> litany = Collections.list(legacyLitany)

标签:返回,Java,构造方法,Effective,静态,工厂,实例,方法
From: https://www.cnblogs.com/wyia/p/16978629.html

相关文章

  • javascript中setInterval越来越快的问题解决方法
    vartimerfunctionrun(){ //clearInterval要放在方法开始,不然的话,下面的代码还没运行到clearInterval,又开始了循环了。if(timer){clearInter......
  • Java NIO、NIO.2学习笔记
    相关学习资料http://www.ibm.com/developerworks/cn/education/java/j-nio/j-nio.html 目录1.NIO、NIO.2简介2.NIO中的关键技术 1.NIO、NIO.2简介Java中的输入流、输出......
  • java 将小数拆分为两部分+浮点型精度丢失问题
    问题:将一个String类型的小数拆分为整数部分和小数部分,如9.9拆分为9和0.91.将小数的整数和小数部分拆分开publicfloatnumberSub(StringtotalMoney){floatmoneyFl......
  • Java方法
    方法方法的定义方法就是一段可重复调用的代码段,例如:有某段长度约100行的代码,要在多个地方使用此段代码,如果在各个地方都重复编写此部分代码的话,则肯定会比较麻烦,而且此部......
  • pom之 数据源信息 spring-boot-starter-jdbc ,mysql-connector-java
    <!--    数据源信息--><!--    <dependency>--><!--      <groupId>org.springframework.boot</groupId>--><!--      <arti......
  • [Java EE] java.net.SocketException: Connection reset【解决中】
    1错误描述6:44:33.112][DEBUG][http-nio-9527-exec-3][HttpClientUtil]httpposturl:http://bdp-gateway-service-parent-backend-service.bigdata/bdp/public/api/......
  • Java 中的抽象介绍
    这篇文章主要介绍了Java 中的抽象,数据抽象是一种仅向用户显示基本细节的属性。不向用户显示琐碎或非必需的单元,下面文章Java抽象详细内容,需要的朋友可以参考一下目录1......
  • idea 自带java 反编译工具问题
    就在最近升级到idea最新版本,发现以前java-decompiler命令行工具不能使用了,运行会有错误解决方法找到一个地版本的idea拷贝java-decompiler.jar直接替换,或者直接使用......
  • Java程序员除了做增删改查还能干嘛?
      就以Java后端开发为例,说说不同级别程序员干的事情。1初级开发,大概是有3年Java开发经验。  22年底,上海,这批程序员如果学历是本科,薪资一般是8k到2w,当然如果能进......
  • JAVA操作PDF实现简单盖章功能(未签字)
    默认再第一页签章:https://www.cnblogs.com/wolf-shuai/p/16977802.html摘要:jar包准备:bcpkix-jdk15on-1.70.jarbcprov-jdk15on-1.70.jariTextAsian.jaritextpdf-5.5.1......