使用构建器模式扩展类

2023-11-29

我正在尝试将 a 类扩展到 aX 中。所以,我也扩展了aBuilder。然而,虽然我能够使用以下命令创建类 a 的对象:

aBuilder f = new aBuilder();
f.bi = i;
f.bs = s;
a atry = f.withI(i).withS(s).build();

同样的情况对于 aX 不起作用。当我尝试这样做时:

aXBuilder fb = new aXBuilder();
aX aXtry = fb.withI(i).withS(s).withB(b).build();

我收到错误(对于 a.aBuilder 类型,方法 withB(Boolean) 未定义)。 我应该重写 aX 的所有内容,而不是简单地添加新内容吗?我不想这样做,因为这会导致我的代码出现很多重复。 a 类和 aX 类如下所示:

class a {

protected String s;
protected int i;

public void getdata() {
    System.out.println(this.s);
    System.out.println(this.i);
}

protected a(aBuilder fb) {
    this.s = fb.bs;
    this.i = fb.bi;
}

public static class aBuilder {
    public aBuilder() {
    }

    protected String bs;
    protected int bi;

    public aBuilder withS(String s) {
        this.bs = s;
        return this;
    }

    public aBuilder withI(Integer i) {
        this.bi = i;
        return this;
    }

    public a build() {
        return new a(this);
    }

}

}

类 aX 扩展了 {

protected Boolean b;

public void getData()
{
    System.out.println(this.s);
    System.out.println(this.i);
    System.out.println(this.b);
}

protected aX(aXBuilder axb) {
    super(axb);
    this.b = axb.bb;
}

public static class aXBuilder extends aBuilder {
    protected Boolean bb;

    public aXBuilder() {
    }

    public aXBuilder withB(Boolean b) {
        this.bb = b;
        return this;
    };

    public aX build() {
        return new aX(this);
    }
}

}


您可以使用泛型解决您的问题,尽管它确实需要创建抽象超类。潜伏在这个网站上告诉我,从具体类继承被广泛认为是邪恶的。

public abstract class AbstractA {
    protected String s;
    protected int i;
    protected AbstractA() {
    }
    protected abstract static class ABuilder<T extends AbstractA, B extends ABuilder<T,B>> {
        protected T object;
        protected B thisObject;
        protected abstract T getObject(); //Each concrete implementing subclass overrides this so that T becomes an object of the concrete subclass
        protected abstract B thisObject(); //Each concrete implementing subclass builder overrides this for the same reason, but for B for the builder
        protected ABuilder() {
            object = getObject();
            thisObject = thisObject();
        }
        public B withS(String s) {
            object.s = s;
            return thisObject;
        }
        public B withI(int i) {
            object.i = i;
            return thisObject;
        }
        public T build() {
            return object;
        }
    }
}

一旦你有了抽象类,你只需根据需要多次扩展它,重写构建器中的抽象方法即可返回你需要的对象类型。

public final class ConcreteA extends AbstractA {
    private String foo;
    protected ConcreteA() {
    }
    public static final class Builder extends AbstractA.ABuilder<ConcreteA,Builder> {
        @Override protected ConcreteA getObject() {
            return new ConcreteA();
        }
        @Override protected Builder thisObject() {
            return this;
        }
        public Builder() {
        }
        public Builder withFoo(String foo) {
            object.foo = foo;
            return this;
        }
    }
}

Then... ConcreteA baz = new ConcreteA.Builder().withFoo("foo").withS("bar").withI(0).build();

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用构建器模式扩展类 的相关文章

随机推荐

  • 使用正则表达式验证 IP

    我需要验证格式为 000000000 到 255255255 的 IP 范围 3 组数字之间没有任何分隔符 最终 IP 所包含的三组中的每一组都应为 000 是的 用 0 填充 到 255 由于这是我的第一个 stackoverflow 条
  • 如何从远程主机的以太网地址获取其IP地址?

    我正在寻找一些 Linux 代码来从以太网地址查找 IP 地址 我想我必须做一些反向 A RP 欺骗 但我没有找到任何例子 http compnetworking about com od networkprotocolsip f conv
  • Android 谷歌地图在 Zoom 上调整标记大小

    我需要在一个较小的区域中显示大约 30 个标记 当用户更改缩放比例时 是否可以调整 Google Maps API V2 标记的大小 或者我应该使用较小的图像 提前致谢 如果你想在缩放时做一些事情 你可以创建一个扩展原始MapView的自定
  • 副SIM卡的MNC和MCC

    我知道使用TelephonyManager我们可以获得我们网络提供商的MNC和MCC TelephonyManager tel TelephonyManager getSystemService Context TELEPHONY SERV
  • 如何在Python中只打印一个新行? “\n”没有给我想要的效果

    我很清楚print n 但这在我的cmd中给出了这个结果 第一个输出 带有 原始 列表 继续到下一行 但使用 n似乎跳过了一行 我怎样才能确保print pretty函数转到下一行 而不是跳过一行 到目前为止 这是我的代码 board fo
  • 如何在 symfony yml 配置文件中从 docker 获取环境变量

    在 docker compose yml 中 mysql image mysql latest container name mysql environment MYSQL ROOT PASSWORD root MYSQL DATABASE
  • 计算两个给定日期之间的天数

    任何人都可以纠正我的脚本中的错误来计算两个日期之间的天数 日期已通过表格输入 变量信息如下 departon gt Array 0 gt 1 1 gt June 2 gt 2011 returnon gt Array 0 gt 31 1 g
  • CancellationTokenSource 的行为不符合预期

    在这种情况下 预期的是 如果用户通过按回车键取消任务 则另一个任务会被挂钩ContinueWith会运行 但事实并非如此 根据AggregateException尽管在中进行了显式处理 但仍会抛出ContinueWith这显然没有被执行 请
  • gvisTables 未在闪亮的应用程序中呈现

    我试图解决的实际问题 我正在创建一个包含数据表的仪表板 我希望用逗号将数字格式化为千位分隔符 但是当 DT 包与 Shiny 一起使用时 它 显然 存在问题 因为逗号分隔的格式会导致 DT renderDataTable 将数字读取为字符
  • 如何在 QLineEdit 中放置静态文本(后缀、前缀)?

    如何将静态文本放入QLine编辑在 Qt C 中 这样它就不能被删除 并且当我写入 QLineEdit 时 它不应该被分隔 没有常规的方法来放置前缀或后缀QLabel 占位符 只要你能做到QLineEdit是设置一个文本 当里面没有文本时将
  • moveRowAtIndexPath - 在部分之间移动单元格

    在我的 UITableView 中我有这样的关系 Department lt Employees 名称数组 我已经为每个模型设置了自定义对象 In my moveRowAtIndexPath 我可以移动到特定的部分 但是 如果我尝试在部分之
  • 如何设置量角器以使用 requirejs 导入 AMD 模块

    我正在尝试在量角器测试中导入 AMD 模块 ES6 模块在 ES5 中转译 我正在使用页面对象图案 页面对象是我要导入的模块 这是 ES6 代码 import HelloPage from HelloPage describe The de
  • 用引号括起来

    在 Eclipse JDT 中如何将多行选择转换为字符串 就像下面这样 From xxxx yyyy zzz To xxxx yyyy zzz 我尝试了以下模板 line selection cursor 但这样我只能将整个块包围起来 而不
  • Apps 脚本对话框中的 CSS

    我不是 Web 开发人员 过去只使用过一次 CSS 使用CSS的流程是怎样的 这可能吗 var pointsSheet SpreadsheetApp openById 1o8 f063j1jYZjFEnI P7uAztpnEAvQ6mc3Z
  • 在 Golang 中深度复制地图

    据我了解 地图是 Go 中的引用类型 所以赋值会做浅拷贝 我计划在 golang 中对 Maps 进行递归深度复制 递归是因为我正在处理一个包含 JSON 未编组内容的映射 func deepCopyJSON src map string
  • 不正确的函数声明语法错误:意外的cornerFinder,期望(

    当我尝试运行此代码时收到此错误 语法错误 意外的cornerFinder 期望 case v2 func cornerFinder censusData CensusGroup if len censusData lt 10000 for
  • PHP 的 Facebook HipHop 虚拟机?

    我看过这篇文章 HipHop PHP Facebook 的 Hyper PHP 不过最近遇到这个Facebook 通过 HipHop 虚拟机 加快开发速度 PHP 执行器速度提高 60 有人有这方面的详细信息吗 它值得 PHP 开发人员探索
  • 将对象传递到选项卡应用程序中的另一个视图控制器[重复]

    这个问题在这里已经有答案了 我想知道如何将对象从视图控制器传递到选项卡应用程序中的另一个视图控制器 到目前为止我已经这样做了 我在 Xcode 中创建了 选项卡应用程序 然后我得到两个视图控制器 FirstViewController 和
  • Java 8:按属性对对象列表进行排序,无需自定义比较器

    完成这项工作最干净的捷径是什么 class AnObject Long attr List
  • 使用构建器模式扩展类

    我正在尝试将 a 类扩展到 aX 中 所以 我也扩展了aBuilder 然而 虽然我能够使用以下命令创建类 a 的对象 aBuilder f new aBuilder f bi i f bs s a atry f withI i withS