zoukankan      html  css  js  c++  java
  • Item1:使用静态工厂方法替代构造器

    Item1:静态工厂方法替代构造器

    优势

    1.静态工厂方法可以命名

    • 构造器没有名字
    • 构造器重载过多,不知道实际返回对象含义

      BigInteger(int, int, Random)
      该构造器实际返回对象表示该对象可能是一个质数。
      如果实际提供一个BigInteger.probablePrime静态工厂方法,可以做到见名知义

    • 构造器重载过多会导致构造对象困难
    • 需要多个构造器的类可以提供多个静态工厂方法

    2.创建对象可控

    • 构造方法每次调用都会new新对象
    • 静态工厂方法创建对象时可自由控制,可每次new,可缓存
    • instance-controlled=实例受控,用于确保单例

    3.可以返回子类实例

    • 构造器没得选,只能返回当前类型
    • 静态工厂方法可以返回子类对象

    4.返回对象的类型可以根据输入参数的不同而不同

    • EnumSet会根据枚举类成员的个数确定返回那个具体实现类
      • JumboEnumSet
      • RegularEnumSet

    5.静态工厂可以返回接口类型,运行时才需要实现类

    劣势

    1.没有公共或受保护构造方法的类不能被继承

    2.相比构造器,静态工厂方法不好找

    命名规约

    1.from类型转换方法,接受单个参数并返回此类型的相应实例

    Date d = Date.from(instant);

    2.of聚合方法,接受多个参数并返回该类型的实例,并把他们合并在一起

    Set<Rank> faceCards = EnumSet.of(JACK, QUEEN, KING);

    3.valueOf

    BigInteger prime = BigInteger.valueOf(Integer.MAX_VALUE);

    4.getinstance返回一个由其参数 (如果有的话) 描述的实例

    StackWalker luke = StackWalker.getInstance(options)

    5.newInstance

    Object newArray = Array.newInstance(classObject, arrayLen)

    参考文献

    Baeldung

    Effective Java 3rd

    总结

    1.使用静态工厂构造对象,产生的对象是可控的。可以参加单例模式

    2.构造器不用承接复杂逻辑

    3.见名之义,写很多构造器会给后继者产生误导

    4.一个item就可以研究好几天,贵在精,不在快





    网络知识搬运/梳理小工
  • 相关阅读:
    OC之runtime面试题(一)
    OC之runtime的(isKindOfClass和isMemberOfClass)
    OC之runtime(super)
    OC中的__block修饰符
    iOS录音及播放
    webpack5升级过程遇到的一些坑?
    (转)iOS工具--CocoaPods 安装使用总结
    iOS学习--NSObject详解
    iOS学习--通过ipa包如何获取图片资源
    ‘A downloaded software component is corrupted and will not be used. ‘ while publish an iOS app to apple store via Xcode
  • 原文地址:https://www.cnblogs.com/aibilim/p/e81016a22ab54b1a3297137137cce33d.html
Copyright © 2011-2022 走看看