【问题标题】:Looking for patterns and API design with Java generics使用 Java 泛型寻找模式和 API 设计
【发布时间】:2013-10-20 20:59:44
【问题描述】:

在处理 Java 集合和 Guava 时,我非常广泛地使用泛型。我在使用 API 时非常了解:

  1. PECS 规则
  2. {co, contra, in}variance
  3. 通配符
  4. 有界泛型

但是,我发现使用泛型创建 API 很困难。 Java 泛型有设计模式吗?或者对 Java 泛型的任何引用也会有所帮助。我读过:

  1. 有效的 Java
  2. “Java 泛型和集合”一书
  3. http://www.angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html

我只熟悉泛型有用的两种模式:

  1. 遏制概念:Java 集合、Guava Optional<T>
  2. 类型参数化:Guava Predicate<T>, Function<T>

【问题讨论】:

  • 如果你读过 Effective Java,那么正如 Yoda 所说,“你不需要更多的培训。已经了解你,你需要的。”

标签: java generics design-patterns api-design


【解决方案1】:

大多数标准设计模式都是关于标准 OO 中固有的具有继承和组合的特殊多态性。泛型是关于参数多态性的。你的第二个“模式”基本上包含了整个概念,所以我不会称之为模式。

那么参数模式是什么?

贷款人模式怎么样。借出或借用什么类型的资源并不重要,因此它可以是一个通用参数。

工厂也可以使用泛型来表达。生成的实例类型是一个参数。

函数或回调对象通常以 void 和 T-returning 形式出现。

这是您要求的抽象级别吗?

随着我想出更多,我会继续编辑这个答案。

就 API 而言,我的经验法则是尝试接受尽可能广泛的类型,这意味着方法参数中的通配符本质上是尽可能多的,使用方差来决定 extendssuper 是否合适,并返回尽可能具体的类型,这意味着尽可能少的类型变量或通配符。

【讨论】:

  • 不错的答案。是的,这正是我所期待的。如果您可以提供示例或指向参考,那将会很有帮助(例如,Lender 模式等同于 Guava 的 Supplier,如果这就是您的意思)。您能否还举例说明经验法则的好处?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-27
  • 2011-01-13
相关资源
最近更新 更多