• 请不要在回答技术问题时复制粘贴 AI 生成的内容
bbbai
V2EX  ›  程序员

一个 Java 的小问题

  •  
  •   bbbai · Sep 27, 2018 · 3604 views
    This topic created in 2958 days ago, the information mentioned may be changed or developed.

    看到有代码是如下这样写的,

    class A{

    private A(B b){...}

    public static A of(B b) { return new A(b); }

    }

    这样写的好处是什么呢? 如果这是一种好的风格或者手段的话,是否有一种获取途径,来了解好的风格或者手段?

    16 replies  •  2018-09-28 09:20:49 +08:00
    yemoluo
    yemoluo
    Sep 27, 2018
    1
    单例模式了解下,嗯,其实,好处不仅仅是单例
    elgae
    elgae
    Sep 27, 2018
    2
    @GTim 这跟单例有一毛钱关系?
    yemoluo
    yemoluo
    Sep 27, 2018
    3
    @elgae 说说你的看法
    linshuang
    linshuang
    Sep 27, 2018
    4
    也是第一次看见,或许可以把 of 替换成一个句子来达到代码具备更强的语义的目的. 就模式而言,至少我没见过这种。
    例如 Parent p = Parent.withChildren(children)
    maninfog
    maninfog
    Sep 27, 2018 via Android
    5
    @GTim 这个每次都是 new 和单例的确无关阿
    这种写法估计是为了利用静态方法名充当注释的作用,个人感觉。
    icris
    icris
    Sep 27, 2018❤️1
    6
    参考示例:BigInteger.valueOf(1)
    lululau
    lululau
    Sep 27, 2018
    7
    new A(b) VS A.of(b)
    lululau
    lululau
    Sep 27, 2018
    8
    8 个字符 VS 7 个字符,效率提升了
    wbgbg
    wbgbg
    Sep 27, 2018❤️1
    9
    Effective Java 第一条 考虑使用静态工厂方法替代构造方法
    这里的主要优点就是有方法名来表示含义
    sutra
    sutra
    Sep 27, 2018
    10
    可以参考 Instant.ofXXX() 的实现,可以看出来它并不是每次都 new 一个对象出来,有些是直接用的共享的对象。
    CasualYours
    CasualYours
    Sep 27, 2018 via Android
    11
    Optional 类就是这种写法,好处就是代码语义更直接吧。
    Cbdy
    Cbdy
    Sep 27, 2018❤️1
    12
    Effective Java 第三版第二章第一节有详细介绍

    我简单摘录一下:

    ### 优点

    One advantage of static factory methods is that, unlike constructors, they have names.

    A second advantage of static factory methods is that, unlike constructors, they are not required to create a new object each time they ’ re invoked.

    A third advantage of static factory methods is that, unlike constructors, they can return an object of any subtype of their return type.

    A fourth advantage of static factories is that the class of the returned object can vary from call to call as a function of the input parameters.

    A fifth advantage of static factories is that the class of the returned object need not exist when the class containing the method is written.

    ### 缺点

    The main limitation of providing only static factory methods is that classes without public or protected constructors cannot be subclassed.

    A second shortcoming of static factory methods is that they are hard for programmers to find.

    ### 一些常见的静态构造方法

    **from**: A type-conversion method that takes a single parameter and returns a corresponding instance of this type, for example:

    ```java
    Date d = Date.from(instant);
    ```

    **of**: An aggregation method that takes multiple parameters and returns an instance of this type that incorporates them, for example:

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

    **valueOf**: A more verbose alternative to from and of, for example:

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

    **instance** or **getInstance**: Returns an instance that is described by its parameters (if any) but cannot be said to have the same value, for example:

    StackWalker luke = StackWalker.getInstance(options);

    **create** or **newInstance**: Like instance or getInstance, except that the method guarantees that each call returns a new instance, for example:

    ```java
    Object newArray = Array.newInstance(classObject, arrayLen);
    ```
    CasualYours
    CasualYours
    Sep 27, 2018 via Android
    13
    @GTim 不是单机例,of 静态方法每次都返回新的实例。
    Raymon111111
    Raymon111111
    Sep 27, 2018
    14
    这是工厂, 了解一下工厂模式即可.
    lowzoom
    lowzoom
    Sep 28, 2018
    15
    class A 体现不出这个写法的精髓,要 interface A
    bk201
    bk201
    Sep 28, 2018
    16
    我认为是方便链式调用
    类似 a.of(b).add(c).avg()
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1287 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 51ms · UTC 21:08 · PVG 05:08 · LAX 13:08 · JFK 16:08
    ♥ Do have faith in what you're doing.