看到有代码是如下这样写的,
class A{
private A(B b){...}
public static A of(B b) { return new A(b); }
}
这样写的好处是什么呢? 如果这是一种好的风格或者手段的话,是否有一种获取途径,来了解好的风格或者手段?
1
yemoluo 2018 年 9 月 27 日
单例模式了解下,嗯,其实,好处不仅仅是单例
|
4
linshuang 2018 年 9 月 27 日
也是第一次看见,或许可以把 of 替换成一个句子来达到代码具备更强的语义的目的. 就模式而言,至少我没见过这种。
例如 Parent p = Parent.withChildren(children) |
6
icris 2018 年 9 月 27 日 参考示例:BigInteger.valueOf(1)
|
7
lululau 2018 年 9 月 27 日
new A(b) VS A.of(b)
|
8
lululau 2018 年 9 月 27 日
8 个字符 VS 7 个字符,效率提升了
|
9
wbgbg 2018 年 9 月 27 日 Effective Java 第一条 考虑使用静态工厂方法替代构造方法
这里的主要优点就是有方法名来表示含义 |
10
sutra 2018 年 9 月 27 日
可以参考 Instant.ofXXX() 的实现,可以看出来它并不是每次都 new 一个对象出来,有些是直接用的共享的对象。
|
11
CasualYours 2018 年 9 月 27 日 via Android
Optional 类就是这种写法,好处就是代码语义更直接吧。
|
12
Cbdy 2018 年 9 月 27 日 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); ``` |
13
CasualYours 2018 年 9 月 27 日 via Android
@GTim 不是单机例,of 静态方法每次都返回新的实例。
|
14
Raymon111111 2018 年 9 月 27 日
这是工厂, 了解一下工厂模式即可.
|
15
lowzoom 2018 年 9 月 28 日
class A 体现不出这个写法的精髓,要 interface A
|
16
bk201 2018 年 9 月 28 日
我认为是方便链式调用
类似 a.of(b).add(c).avg() |