【问题标题】:When a class or interface acts as its own factory, are there conventions / best practices for choosing the name of the factory method?当一个类或接口充当自己的工厂时,是否有选择工厂方法名称的约定/最佳实践?
【发布时间】:2021-07-29 12:04:15
【问题描述】:

我的问题可能是this more general one 的一个特例,但那里的答案不适用于我的情况(并说它取决于上下文)。

考虑这样一种情况,接口或类充当它们自己的工厂。例如,Java 8 中的接口 Stream 带有静态方法 of(...) 和类 Optional 带有静态方法 of(...)。虽然我还没有使用 Java 9,但我看到还有接口 ListSetMap 为后者获得了静态工厂方法 of(...)ofEntries(...)。它们似乎都从作为参数传递的所有条目创建不可变对象。

对于我自己的类,我经常使用名称from(otherObject) 从类似的对象中创建一个新对象,但我还没有看到其他地方使用过这个命名。最初我很想使用of(otherObject),如果另一个对象将成为新对象的成员,并且更改另一个对象会影响新对象,而from(otherObject),如果我只从另一个对象中取出信息构造时间和对其他对象的更改不会影响新对象。但是根据我一开始的例子,“of(...)”这个名字似乎是为创建不可变对象而保留的。
所以我的具体问题是:

  1. 有没有人看到 from(...) 在 JDK 包中用作创建者方法/工厂方法,如果有,具体含义是什么?
  2. 我怎样才能最好地用创建者方法/工厂方法的名称来表达新对象将依赖于用于构造的相关对象的更改的情况与不依赖于此类更改的情况之间的区别?

顺便说一句,我关于使用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”适用于没有保留对原始对象的引用的情况。

【问题讨论】:

    标签: java factory naming


    【解决方案1】:

    Datetime API 大量使用“from”,例如Instant#from(TemporalAccessor)LocalDate#from(TemporalAccessor)。有趣的是,这些类也使用“of”,如LocalDate#of(int, int, int)


    通过观察和比较不同的情况,IMO fromof的区别在于:

    参数中的所有数据都用于构造对象吗?

    "from" 在创建的对象从参数中提取数据时使用,其中 "of" 使用参数中的所有数据。

    所以当我们有A a = A.of(b)时,通常意味着b可以从a推导出来,这对于A a = A.from(b)的情况是不可能的。

    【讨论】:

    • 感谢示例!可逆性(据我了解您的评论)是一个有趣的方面。事实上,我考虑使用“of”的方式(保留对原始对象的支持引用)也具有这种可逆性。只说一句:您从“from和to”之间的区别开始,然后描述“from”和“of”之间的区别,所以我猜第一个是错字? (P.S. 还不能给出学分)
    猜你喜欢
    • 2013-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-29
    • 1970-01-01
    • 1970-01-01
    • 2016-05-03
    相关资源
    最近更新 更多