既然你提到了jOOQ library,我将在这里给出一个权威的答案,作为jOOQ的作者,并写了这篇关于设计流畅API的帖子(或者更确切地说:用Java设计内部特定领域的语言):
https://blog.jooq.org/2012/01/05/the-java-fluent-api-designer-crash-course
SomeType22 只是一个名义元组类型
您发现的是 API 设计人员使用元组的共同愿望。一些语言内置了对结构化元组类型的支持,即可以以特别方式创建的元组类型,而不是提前声明它们并给它们命名。后者称为名义类型。 More details about nominal/structural typing here.
支持结构元组类型的语言示例:
SQL 是允许创建临时元组类型的语言的一个很好的例子:
SELECT first_name, last_name, age
FROM people
上述查询创建了一个类型为(string, string, number) 的3 级元组表。 JavaScript 是另一个示例,我可以在其中快速生成这样的元组:
var x = {
firstName: "Lukas",
lastName: "Eder",
age: undefined
};
还有其他语言在某种程度上支持元组。理想情况下,元组允许通过名称和索引访问单个属性。有时,只能通过名称授予访问权限。在其他情况下,它仅由索引给出。但从概念上讲,它总是一样的。
DerivedColumnList22 和 Action9 是什么意思
不幸的是,Java 语言没有这样的工具来创建临时结构元组类型。 (几乎)Java 中的所有内容都需要在名义上键入。甚至“匿名函数”(lambda 表达式)也需要分配给名义上的 SAM 类型:
Runnable r = () -> { doSomething(); }
// ^^^^^^^^^^^^^^^^^^^^^^^^ --- Syntactically looks like a structural type
// ^^^^^^^^^^ ------------------------------ But it's really a nominal type
因此,如果 API 想要给用户一种支持真实结构元组类型的错觉,它必须提前为每种支持的类型提供名称。比如Action9:
Action9<T1, T2, T3, T4, T5, T6, T7, T8, T9> action =
(a, b, c, d, e, f, g, h, i) -> { doSomething(); }
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^ ------------- Look ma! Almost a structural tuple type!
因此,这种技术主要由 RxJava(它鼓励结构元组类型真正发挥作用的函数式编程)或 jOOQ(它鼓励结构元组类型也真正发挥作用的 SQL)等库实现。
其他库/API 包括:
这并不意味着您在自己的 DSL 中需要这些类型。开始简单。最终,您可能会觉得需要添加它们。