当 class 或接口充当自己的工厂时,是否有选择工厂方法名称的约定/最佳实践?
When a class or interface acts as its own factory, are there conventions / best practices for choosing the name of the factory method?
我的问题可能是 this more general one 的特例,但那里的答案不适用于我的情况(并说它取决于上下文)。
考虑这样一种情况,其中一个接口或一个 class 作为它们自己的工厂。示例将在 Java 8 中使用静态方法 of(...)
的接口 Stream 和使用静态方法 of(...)
的 class Optional
。虽然我还没有使用Java 9,但我看到List
、Set
和Map
接口也获得了静态工厂方法of(...)
或 ofEntries(...)
用于后者。他们似乎都从作为参数传递的所有条目创建不可变对象。
对于我自己的 classes,我经常使用名称 from(otherObject)
从相似的对象中创建一个新对象,但我没有看到其他地方使用过这个命名。本来我很想用of(otherObject)
,如果other对象会成为新对象的成员,对otherObject的改变会影响到新对象,而from(otherObject)
,如果我只把信息取出来构建时的另一个对象和对另一个对象的更改不会影响新对象。但是根据我一开始的示例,名称“of(...)”似乎是为创建不可变对象保留的。
所以我的具体问题是:
- 有没有人看到
from(...)
在 JDK 包中用作创建者 method/factory 方法,如果是,具体含义是什么?
- 我怎样才能用创建者的名字 method/factory 方法来最好地表达新对象将取决于用于构造的相关对象的变化的情况和不依赖的情况之间的区别取决于这样的变化?
顺便说一句,我关于使用 from()
和 of()
的想法源于这样一个事实,即在另一个方向上(class 或对象是另一个 [=66= 的工厂],使用这个class的一个实例作为创建的信息)一些对象有包含“to
”(例如List#toArray()
)的方法来创建一个新对象,不依赖于旧的,和“as
”(例如Arrays.asList(...)
),当新对象将取决于旧对象的变化时。
编辑: 写完这个问题后,我意识到我对“of”的预期使用与我提到的不变性用法并不矛盾。例如。在 List
的示例中,creator 方法 of(E... elements)
的参数不是另一个 List
(对应于我的预期用例),而是 List
。不变性意味着所有这些对条目的引用都无法更改。但是对每个条目对象(不是它们的引用)的更改将明显影响新的 List
(请参阅 java-docs 中的 here)。如果 List
有另一个创建者方法 ofList(List anotherList)
,那么保留对 anotherList
的引用并在新列表中看到旧列表中的更改是合乎逻辑的。所以我想我已经决定在这种情况下使用“of”。如果人们同意,那么剩下的问题就是,“from”是否适用于不保留对原始对象的引用的情况。
日期时间 API 大量使用“from”,例如 Instant#from(TemporalAccessor)
, LocalDate#from(TemporalAccessor)
. It is quite interesting that, those class also use "of" like LocalDate#of(int, int, int)
。
通过观察和比较不同的情况,IMO,from 和 of 之间的不同是:
参数中的所有数据都是用来构造对象的吗?
"from"用于当创建的对象正在从参数中提取数据时,其中"of"使用所有来自参数的数据参数.
所以当我们有A a = A.of(b)
时,通常意味着b
可以从a
推导出来,这对于A a = A.from(b)
.[=18=的情况是不可能的]
我的问题可能是 this more general one 的特例,但那里的答案不适用于我的情况(并说它取决于上下文)。
考虑这样一种情况,其中一个接口或一个 class 作为它们自己的工厂。示例将在 Java 8 中使用静态方法 of(...)
的接口 Stream 和使用静态方法 of(...)
的 class Optional
。虽然我还没有使用Java 9,但我看到List
、Set
和Map
接口也获得了静态工厂方法of(...)
或 ofEntries(...)
用于后者。他们似乎都从作为参数传递的所有条目创建不可变对象。
对于我自己的 classes,我经常使用名称 from(otherObject)
从相似的对象中创建一个新对象,但我没有看到其他地方使用过这个命名。本来我很想用of(otherObject)
,如果other对象会成为新对象的成员,对otherObject的改变会影响到新对象,而from(otherObject)
,如果我只把信息取出来构建时的另一个对象和对另一个对象的更改不会影响新对象。但是根据我一开始的示例,名称“of(...)”似乎是为创建不可变对象保留的。
所以我的具体问题是:
- 有没有人看到
from(...)
在 JDK 包中用作创建者 method/factory 方法,如果是,具体含义是什么? - 我怎样才能用创建者的名字 method/factory 方法来最好地表达新对象将取决于用于构造的相关对象的变化的情况和不依赖的情况之间的区别取决于这样的变化?
顺便说一句,我关于使用 from()
和 of()
的想法源于这样一个事实,即在另一个方向上(class 或对象是另一个 [=66= 的工厂],使用这个class的一个实例作为创建的信息)一些对象有包含“to
”(例如List#toArray()
)的方法来创建一个新对象,不依赖于旧的,和“as
”(例如Arrays.asList(...)
),当新对象将取决于旧对象的变化时。
编辑: 写完这个问题后,我意识到我对“of”的预期使用与我提到的不变性用法并不矛盾。例如。在 List
的示例中,creator 方法 of(E... elements)
的参数不是另一个 List
(对应于我的预期用例),而是 List
。不变性意味着所有这些对条目的引用都无法更改。但是对每个条目对象(不是它们的引用)的更改将明显影响新的 List
(请参阅 java-docs 中的 here)。如果 List
有另一个创建者方法 ofList(List anotherList)
,那么保留对 anotherList
的引用并在新列表中看到旧列表中的更改是合乎逻辑的。所以我想我已经决定在这种情况下使用“of”。如果人们同意,那么剩下的问题就是,“from”是否适用于不保留对原始对象的引用的情况。
日期时间 API 大量使用“from”,例如 Instant#from(TemporalAccessor)
, LocalDate#from(TemporalAccessor)
. It is quite interesting that, those class also use "of" like LocalDate#of(int, int, int)
。
通过观察和比较不同的情况,IMO,from 和 of 之间的不同是:
参数中的所有数据都是用来构造对象的吗?
"from"用于当创建的对象正在从参数中提取数据时,其中"of"使用所有来自参数的数据参数.
所以当我们有A a = A.of(b)
时,通常意味着b
可以从a
推导出来,这对于A a = A.from(b)
.[=18=的情况是不可能的]