Java API 中的 Builder Pattern 示例?

2022-09-03 09:18:03

Joshua Bloch的 Effective Java描述了一种生成器模式,可用于构建具有多个可选可自定义参数的对象。他为Builder函数建议的命名约定,即“模拟Ada和Python中发现的命名可选参数”,似乎不符合Java的标准命名约定。Java函数倾向于依靠一个动词来启动函数,然后依靠一个基于名词的短语来描述它的作用。Builder 类仅具有要由该函数定义的变量的名称。

Java 标准库中是否有任何使用生成器模式的 API?在继续使用它之前,我想将书中的建议与核心Java库集中的实际实现进行比较。


答案 1

我不确定在核心JDK中,但是在番石榴中可以找到很好的例子。MapMaker可能是我能想到的最好的例子。例如,从文档中:

ConcurrentMap<Key, Graph> graphs = new MapMaker()
    .concurrencyLevel(32)
    .softKeys()
    .weakValues()
    .expiration(30, TimeUnit.MINUTES)
    .makeComputingMap(
        new Function<Key, Graph>() {
          public Graph apply(Key key) {
            return createExpensiveGraph(key);
          }
        });

是的,这种事情可能与“标准”Java命名的颗粒背道而驰,但它也可以非常可读。

对于您不返回“this”而是返回新对象(通常具有不可变类型)的情况,我喜欢“with”前缀 - Joda Time广泛使用该模式。这不是建筑商模式,而是一种替代的相关建筑形式。


答案 2

区域设置类具有生成器模式的一个示例。https://docs.oracle.com/javase/7/docs/api/java/util/Locale.Builder.html

用法:

Locale locale = new Builder().setLanguage("sr").setScript("Latn").setRegion("RS").build();

推荐