
看到有代码是如下这样写的,
class A{
private A(B b){...}
public static A of(B b) { return new A(b); }
}
这样写的好处是什么呢? 如果这是一种好的风格或者手段的话,是否有一种获取途径,来了解好的风格或者手段?
1 yemoluo 2018-09-27 18:10:44 +08:00 单例模式了解下,嗯,其实,好处不仅仅是单例 |
4 linshuang 2018-09-27 18:46:34 +08:00 也是第一次看见,或许可以把 of 替换成一个句子来达到代码具备更强的语义的目的. 就模式而言,至少我没见过这种。 例如 Parent p = Parent.withChildren(children) |
5 maninfog 2018-09-27 18:52:38 +08:00 via Android @GTim 这个每次都是 new 和单例的确无关阿 这种写法估计是为了利用静态方法名充当注释的作用,个人感觉。 |
6 icris 2018-09-27 18:54:57 +08:00 参考示例:BigInteger.valueOf(1) |
7 lululau 2018-09-27 18:59:31 +08:00 new A(b) VS A.of(b) |
8 lululau 2018-09-27 19:00:05 +08:00 8 个字符 VS 7 个字符,效率提升了 |
9 wbgbg 2018-09-27 19:02:26 +08:00 Effective Java 第一条 考虑使用静态工厂方法替代构造方法 这里的主要优点就是有方法名来表示含义 |
10 sutra 2018-09-27 19:02:41 +08:00 可以参考 Instant.ofXXX() 的实现,可以看出来它并不是每次都 new 一个对象出来,有些是直接用的共享的对象。 |
11 CasualYours 2018-09-27 19:06:57 +08:00 via Android Optional 类就是这种写法,好处就是代码语义更直接吧。 |
12 Cbdy 2018-09-27 19:08:13 +08:00 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, forexample: ```java Object newArray = Array.newInstance(classObject, arrayLen); ``` |
13 CasualYours 2018-09-27 19:09:39 +08:00 via Android @GTim 不是单机例,of 静态方法每次都返回新的实例。 |
14 Raymon111111 2018-09-27 19:29:57 +08:00 这是工厂, 了解一下工厂模式即可. |
15 lowzoom 2018-09-28 01:05:47 +08:00 class A 体现不出这个写法的精髓,要 interface A |
16 bk201 2018-09-28 09:20:49 +08:00 我认为是方便链式调用 类似 a.of(b).add(c).avg() |