一个 Java 的小问题

2018-09-27 17:53:07 +08:00
 bbbai

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

class A{

private A(B b){...}

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

}

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

2037 次点击
所在节点    程序员
16 条回复
GTim
2018-09-27 18:10:44 +08:00
单例模式了解下,嗯,其实,好处不仅仅是单例
elgae
2018-09-27 18:12:24 +08:00
@GTim 这跟单例有一毛钱关系?
GTim
2018-09-27 18:13:22 +08:00
@elgae 说说你的看法
linshuang
2018-09-27 18:46:34 +08:00
也是第一次看见,或许可以把 of 替换成一个句子来达到代码具备更强的语义的目的. 就模式而言,至少我没见过这种。
例如 Parent p = Parent.withChildren(children)
maninfog
2018-09-27 18:52:38 +08:00
@GTim 这个每次都是 new 和单例的确无关阿
这种写法估计是为了利用静态方法名充当注释的作用,个人感觉。
icris
2018-09-27 18:54:57 +08:00
参考示例:BigInteger.valueOf(1)
lululau
2018-09-27 18:59:31 +08:00
new A(b) VS A.of(b)
lululau
2018-09-27 19:00:05 +08:00
8 个字符 VS 7 个字符,效率提升了
wbgbg
2018-09-27 19:02:26 +08:00
Effective Java 第一条 考虑使用静态工厂方法替代构造方法
这里的主要优点就是有方法名来表示含义
sutra
2018-09-27 19:02:41 +08:00
可以参考 Instant.ofXXX() 的实现,可以看出来它并不是每次都 new 一个对象出来,有些是直接用的共享的对象。
CasualYours
2018-09-27 19:06:57 +08:00
Optional 类就是这种写法,好处就是代码语义更直接吧。
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, for example:

```java
Object newArray = Array.newInstance(classObject, arrayLen);
```
CasualYours
2018-09-27 19:09:39 +08:00
@GTim 不是单机例,of 静态方法每次都返回新的实例。
Raymon111111
2018-09-27 19:29:57 +08:00
这是工厂, 了解一下工厂模式即可.
lowzoom
2018-09-28 01:05:47 +08:00
class A 体现不出这个写法的精髓,要 interface A
bk201
2018-09-28 09:20:49 +08:00
我认为是方便链式调用
类似 a.of(b).add(c).avg()

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/493263

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX