当前位置: 首页 > 面试题库 >

在子类中使用构造函数中的Builder模式

公孙成仁
2023-03-14
问题内容

我目前正在使用Builder模式,紧跟在Wikipedia文章 Builder模式
http://en.wikipedia.org/wiki/Builder_pattern中建议的Java实现

这是一个示例代码,说明了我的实现

public class MyPrimitiveObject {
  private String identifier="unknown";
  public static class Builder {
    private final MyPrimitiveObject obj = new MyPrimitiveObject();
    public MyPrimitiveObject build() { return obj; }
    public Builder setidentifier (String val) {
     obj.identifier = val;
     return this;
    }
  }
  public static Builder createBuilder() { return new Builder(); }
  @Override public String toString() { return "ID: "+identifier; }
}

在我的一些使用此类的应用程序中,我碰巧发现了非常相似的建筑代码,因此我想将其子类化MyPrimitiveObjectMySophisticatedObject并将所有重复的代码移入其构造函数中。这就是问题所在。

如何调用超类生成器并将其返回的对象分配为我的实例?

public class MySophisticatedObject extends MyPrimitiveObject {
  private String description;
  public MySophisticatedObject (String someDescription) {
    // this should be the returned object from build() !!
    Builder().setidentifier(generateUUID()).build()
    description = someDescription;
  }     
}

问题答案:

您可能需要考虑使用嵌套的MySophisticatedObject.Builderextends
MyPrimitiveObject.Builder,并覆盖其build()方法。在构建器中具有受保护的构造函数,以 接受 要在其上设置值的实例:

public class MyPrimitiveObject {
  private String identifier="unknown";
  public static class Builder {
    private final MyPrimitiveObject obj;
    public MyPrimitiveObject build() { return obj; }
    public Builder setidentifier (String val) {
     obj.identifier = val;
     return this;
    }

    public Builder() {
        this(new MyPrimitiveObject());
    }

    public Builder(MyPrimitiveObject obj) {
        this.obj = obj;
    }
  }
  ...
}

public class MySophisticatedObject extends MyPrimitiveObject {
  private String description;

  public static class Builder extends MyPrimitiveObject.Builder {
    private final MySophisticatedObject obj;
    public Builder() {
      this(new MySophisticatedObject());
      super.setIdentifier(generateUUID());
    }     
    public Builder(MySophisticatedObject obj) {
      super(obj);
      this.obj = obj;
    }

    public MySophisticatedObject build() {
      return obj;
    }

    // Add code to set the description etc.
  }
}


 类似资料:
  • 我目前正在使用Builder模式,密切遵循Wikipedia文章Builder pattern http://en.Wikipedia.org/wiki/builderpattern中建议的Java实现 这是一个示例代码,它将我的实现 我如何调用超类构建器并将其返回的对象分配为我的实例?

  • 所以我刚刚发现了Lombok注释,我喜欢它。尤其是对于集合的注释。 在继承的情况下,我读到为子类创建构建器的最有效方法如下:

  • 问题内容: 我有一个“ ChildClass”类,它扩展了“ ParentClass”类。我不想完全替换父类的构造函数,而是要先调用父类的构造函数,然后再做一些额外的工作。 我相信默认情况下会调用父类的0参数构造函数。这不是我想要的 我需要用参数调用构造函数。这可能吗? 我试过了 但这不起作用,因为您无法修改“ this”。 问题答案: 您可以从子代的构造函数中以“ super”引用父代的构造函数

  • 我正在为即将到来的考试做一些修订,我对对象构造函数中枚举的使用有点困惑。

  • 我是莫基托的新手。假设我有一节这样的课 我正在使用Mockito编写一个JUnit测试,我正在使用构造函数创建类的对象。当我安装类时,是否可以模拟Drew()方法?

  • 问题内容: 我正在尝试创建一个将字段作为参数的构造函数,然后将其放入存储在超类中的字段中。这是我正在使用的代码 在超类中,我用 我有一个访问器方法 我收到一个错误“ 味道在超类中具有私有访问权 ”,但是我认为这无关紧要,因为我正在调用将其返回到字段的访问器方法? 问题答案: 您应该做什么: 在您的超类中添加一个构造函数: 在Crisps类中: 注释 对您的问题的一些评论: “在超类中,我已经用”