假设我有一个抽象类(BaseThing).它具有一个必需参数(“基本必需”)和一个可选参数(“基本可选”).我有一个扩展它的具体类(事物).它还具有一个必需参数(“ required”)和一个可选参数(“ optional”).所以像这样:

public abstract class BaseThing {

public static final String DEFAULT_BASE_OPTIONAL = "Default Base Optional";

private final String baseRequired;

private String baseOptional = DEFAULT_BASE_OPTIONAL;

protected BaseThing(final String theBaseRequired) {

this.baseRequired = theBaseRequired;

}

final void setBaseOptional(final String newVal) {

this.baseOptional = newVal;

}

public final void selfDescribe() {

System.out.println("Base Required: " + baseRequired);

System.out.println("Base Optional: " + baseOptional);

selfDescribeHook();

}

protected abstract void selfDescribeHook();

}

和:

public final class Thing extends BaseThing {

public static final String DEFAULT_OPTIONAL = "Default Optional";

private final String required;

private String optional = DEFAULT_OPTIONAL;

Thing(final String theRequired, final String theBaseRequired) {

super(theBaseRequired);

required = theRequired;

}

@Override

protected void selfDescribeHook() {

System.out.println("Required: " + required);

System.out.println("Optional: " + optional);

}

void setOptional(final String newVal) {

optional = newVal;

}

}

我想要一个Thing对象的Joshua Bloch风格的生成器.不过,更笼统地说,我想让BaseThing的具体实现更容易具有构建器,因此,我真正想要的(我认为)是可以轻松用于构建ThingBuilder,OtherThingBuilder或SuperThingBuilder的BaseThing构建器. .

有没有比我提出的建议更好的方法(或者我提出的建议有问题)?

public abstract class BaseThingBuilder {

private String baseOptional = BaseThing.DEFAULT_BASE_OPTIONAL;

public BaseThingBuilder setBaseOptional(final String value) {

baseOptional = value;

return this;

}

public T build() {

T t = buildHook();

t.setBaseOptional(baseOptional);

return t;

}

protected abstract T buildHook();

}

和:

public final class ThingBuilder extends BaseThingBuilder {

private final String baseRequired;

private final String required;

private String optional = Thing.DEFAULT_OPTIONAL;

public ThingBuilder(final String theRequired,

final String theBaseRequired) {

required = theRequired;

baseRequired = theBaseRequired;

}

public ThingBuilder setOptional(final String value) {

optional = value;

return this;

}

protected Thing buildHook() {

Thing thing = new Thing(required, baseRequired);

thing.setOptional(optional);

return thing;

}

}

可用于构建Thing对象的方式类似于以下内容:

BaseThingBuilder builder =

new ThingBuilder("Required!", "Base Required!")

.setOptional("Optional!")

.setBaseOptional("Base Optional!");

Thing thing = builder.build();

thing.selfDescribe();

哪个输出:

Base Required: Base Required!

Base Optional: Base Optional!

Required: Required!

Optional: Optional!

我知道的一个问题,但我认为不是特别重要(尽管可以改进,这样做很好),因为在设置任何基本选项之前必须先设置所有非基本选项:否则会导致语法错误,因为setBaseOptional()返回BaseThingBuilder而不是ThingBuilder.

提前致谢.

java容器类 joshua bloch_java-Builder(Joshua Bloch风格)用于抽象类的具体实现?相关推荐

  1. java+long.builder_Java LongStream.Builder accept()用法及代码示例

    LongStream.Builder accept(long t)用于在流的构建阶段将元素插入到元素中.它接受要构建的流的元素. 用法: void accept(long t) 参数:此方法接受强制参 ...

  2. java容器类的继承结构

    摘要: java容器类的继承结构 Java容器类库定义了两个不同概念的容器,Collection和Map Collection 一个独立元素的序列,这些元素都服从一条或多条规则.List必须按照插入的 ...

  3. Java容器类和包装类

    Java容器类主要有vector和Collection public static void main(String[] args) { // TODO Auto-generated method s ...

  4. java容器类4:Queue深入解读

    Collection的其它两大分支:List和Set在前面已近分析过,这篇来分析一下Queue的底层实现. 前三篇关于Java容器类的文章: java容器类1:Collection,List,Arra ...

  5. java容器类继承_JAVA容器 - weslie - OSCHINA - 中文开源技术交流社区

    一. 数组 1.数组是保存一组对象的最有效的方式.但数组有固定的尺寸而受限(p216) 2.数组与其他种类的容器之间的区别有三方面:效率.类型和保存基本类型的能力.在Java中,数组是一种效率最高的存 ...

  6. java容器类3:set/HastSet/MapSet深入解读

    介绍 Set:集合,是一个不包含重复数据的集合.(A collection that contains no duplicate elements. ) set中最多包含一个null元素,否者包含了两 ...

  7. java double add,Java中的DoubleStream.Builder add()方法

    add()Java中DoubleStream.Builder类的方法将元素添加到正在构建的流中.该方法返回此构建器. 语法如下default DoubleStream.Builder add(doub ...

  8. java容器doc_关于Java容器类学习心得体会.doc

    关于Java容器类学习心得体会 由于小编对C++比较熟悉所以学习Java应该重点体会Java带来的新概念本文基本上是Java标准库中集合框架的基本概念没有例子写本文的目的在于方便小编很长时间后若是忘了 ...

  9. java容器类---概述

    1.容器类关系图 虚线框表示接口. 实线框表示实体类. 粗线框表示最经常使用的实体类. 点线的箭头表示实现了这个接口. 实线箭头表示类能够制造箭头所指的那个类的对象. Java集合工具包位于Java. ...

最新文章

  1. linux显示父目录,linux – 仅列出文件的公共父目录
  2. 秀秀的森林(forest)
  3. jsp分页显示的代码与详细步骤 复制代码
  4. 十六进制字符转二进制字符
  5. react-navigation设置navigationOptions中Static中使用 this 的方法
  6. insert 和 insertSelective的区别
  7. 【HDU - 2570】迷瘴 (贪心,水题,排序,卡精度有坑)
  8. 02-css的选择器
  9. react中的state、props、ref
  10. UVA 11367 Full Tank? 最短路
  11. python编程语言-Python简史:开发者的小小副业如何成为全球最热编程语言?
  12. Minitab 控制图
  13. 小爬需登录的网站之麦子学院
  14. 苹果CMS火车头采集发布模块教程
  15. 一个采集Android手机传感器数据的程序
  16. 怎么样在家拍出好看的证件照?标准证件照拍摄技巧分享
  17. 【ADS学习笔记(一)——ADS介绍】
  18. 2014年珠宝行业下半年电商分析报告及双11销售排名
  19. MacBook随笔之快捷键二(访达和系统快捷键)
  20. A Survey on Deep Learning for Neuroimaging-based Brain Disorder Analysis阅读笔记

热门文章

  1. python3 题解(54 三阶幻方)
  2. 在xp中tc环境下实现的 销售管理系统(可切换繁体和简体,可设密码,可通过修改代码修改字体颜色)
  3. FacebookSDK接入流程、注意事项
  4. Verizon 宣布 48 亿美元收购雅虎核心业务
  5. 湘潭大学信息安全课作业答案2
  6. Memory DFX特性
  7. 干货文稿|当模型预测控制遇见机器学习
  8. pyhanlp 基础用法和教程
  9. 编程之美 一摞烙饼问题
  10. oracle时间相减