【发布时间】:2021-07-29 12:04:15
【问题描述】:
我的问题可能是this more general one 的一个特例,但那里的答案不适用于我的情况(并说它取决于上下文)。
考虑这样一种情况,接口或类充当它们自己的工厂。例如,Java 8 中的接口 Stream 带有静态方法 of(...) 和类 Optional 带有静态方法 of(...)。虽然我还没有使用 Java 9,但我看到还有接口 List、Set 和 Map 为后者获得了静态工厂方法 of(...) 或 ofEntries(...)。它们似乎都从作为参数传递的所有条目创建不可变对象。
对于我自己的类,我经常使用名称from(otherObject) 从类似的对象中创建一个新对象,但我还没有看到其他地方使用过这个命名。最初我很想使用of(otherObject),如果另一个对象将成为新对象的成员,并且更改另一个对象会影响新对象,而from(otherObject),如果我只从另一个对象中取出信息构造时间和对其他对象的更改不会影响新对象。但是根据我一开始的例子,“of(...)”这个名字似乎是为创建不可变对象而保留的。
所以我的具体问题是:
- 有没有人看到
from(...)在 JDK 包中用作创建者方法/工厂方法,如果有,具体含义是什么? - 我怎样才能最好地用创建者方法/工厂方法的名称来表达新对象将依赖于用于构造的相关对象的更改的情况与不依赖于此类更改的情况之间的区别?
顺便说一句,我关于使用from() 和of() 的想法源于另一个方向(类或对象是另一个类的工厂,使用此类的实例作为创建信息)一些对象的方法包含“to”(例如List#toArray())来创建新对象,而不依赖于旧对象的更改,以及“as”(例如Arrays.asList(...)),当新对象将依赖于旧的变化。
编辑:写完这个问题后,我意识到我对“of”的预期用途与我提到的不变性用法并不矛盾。例如。在List 的示例中,创建方法of(E... elements) 的参数不是另一个List(这将对应于我的预期用例),而是List 的条目。不变性意味着所有这些对条目的引用都不能更改。但是对每个条目对象(不是它们的引用)的更改显然会影响新的List(参见java-docs 中的here)。如果List 有另一个创建者方法ofList(List anotherList),那么只有对anotherList 的引用被保留并且旧列表中的更改在新列表中看到是合乎逻辑的。所以我想我已经解决了在这种情况下使用“of”。如果人们同意,那么剩下的问题就是,如果“from”适用于没有保留对原始对象的引用的情况。
【问题讨论】: