使用“旧”对象引用使用构建器模式创建新对象

2024-05-06

我正在尝试构建器模式,并陷入如何向新创建的对象添加新“属性”的困境:

public class MsProjectTaskData {
  private boolean isAlreadyTransfered;
  private String req;    

   public static class Builder {    
    private boolean isAlreadyTransfered = false;

    public Builder withTransfered(boolean val) {
        isAlreadyTransfered = val; 
        return this;
    }    
    public MsProjectTaskData build() {
        return new MsProjectTaskData(this);
    }
   }

   private MsProjectTaskData(Builder builder) {
     isAlreadyTransfered = builder.isAlreadyTransfered;
   }

  public MsProjectTaskData(String req) {
    this.req = req;
  }
}

我可以使用 Builder 创建一个新对象,如下所示:

MsProjectTaskData data = new MsProjectTaskData.Builder().withTransfered(true).build();

但通过这种方法req新创建的对象中的字符串会丢失(当然)。

是否有可能用新集合创建一个新对象isAlreadyTransfered变量和与“旧”req来自“旧”对象的字符串?

也许我必须将旧对象引用传递给生成器,但我不知道该怎么做。也许使用构建器模式对于这种方法来说并不是真正有用?

编辑:(尤金评论后)

想一想,我明白了:

public static class Builder {   
 private boolean isAlreadyTransfered = false;
 private MsProjectTaskData data;

 public Builder(MsProjectTaskData data) {
     this.data = data;
 }

 public Builder withTransfered(boolean val) {
     isAlreadyTransfered = val; 
     data.setAlreadyTransfered(isAlreadyTransfered);
     return this;
 }   
 public MsProjectTaskData build() {
     return data;
 }
}

似乎有效还是上面的代码有问题?我可以不加考虑地使用这种方法吗?


让 Builder 构造函数将“旧”对象作为参数,并将您想要的任何内容设置为新对象。

Edit

您需要阅读更多有关构建器模式的内容,以便更好地掌握它是什么以及您是否really需要它。

一般的想法是,当您有以下情况时,使用构建器模式optional元素。在这方面,Effective Java Item 2 是您最好的朋友。

对于您的类,如果您想从另一个对象构建一个对象并同时使用构建器模式,您可以

  1. 要么在 Builder 构造函数中传递“旧”对象
  2. 创建一个方法from or fromOld, etc.

那看起来怎么样?我将只提供第一个,您可以自己找出第二个。

class MsProjectTaskData {
    private final String firstname;
    private final String lastname;
    private final int age;

    private MsProjectTaskData(Builder builder){
        this.firstname = builder.firstname;
        this.lastname  = builder.lastname;
        this.age       = builder.age;
    }

    public static final class Builder{
        //fields that are REQUIRED must be private final
        private final String firstname;
        private final String lastname;

        //fields that are optional are not final
        private int age;

        public Builder(String firstname, String lastname){
            this.firstname = firstname;
            this.lastname  = lastname;
        }

        public Builder(MsProjectTaskData data){
            this.firstname = data.firstname; 
            this.lastname  = data.lastname;
        }

        public Builder age(int val){
            this.age = val; return this;
        }

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

    public String getFirstname() {
         return firstname;
    }

    public String getLastname() {
         return lastname;
    }

    public int getAge() {
         return age;
    }
}

以及如何从另一个对象创建一个对象:

   MsProjectTaskData.Builder builder = new MsProjectTaskData.Builder("Bob", "Smith");
   MsProjectTaskData oldObj = builder.age(23).build();
   MsProjectTaskData.Builder newBuilder = new MsProjectTaskData.Builder(oldObj);
   MsProjectTaskData newObj = newBuilder.age(57).build();
   System.out.println(newObj.getFirstname() + " " + newObj.getLastname() + " " + newObj.getAge()); // Bob Smith 57
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用“旧”对象引用使用构建器模式创建新对象 的相关文章

随机推荐

  • ckeditor 4.5 fileUploadRequest 事件未触发

    我有一个 html id 为 id textarea 的文本区域 editor CKEDITOR inline id textarea filebrowserBrowseUrl browse url filebrowserUploadUrl
  • Shiro 与 SpringSecurity [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我目前正在评估基于Java的安全框架 我是Spring 3 0用户 因此SpringSecurity似乎是正确的选择 但Spring安全性似乎过
  • 将程序作为字符串传递给 Python 时使用导入和 for 循环

    一位同事最近向我发送了一个 bash 脚本 其中包含一些内联 Python 他使用的命令的形式为 echo e from foo import bar nfor i in range 10 n bar i 1 thing something
  • 检查对象是否具有属性,而不依赖于“__getattr__”

    有没有一种方法可以检查对象是否具有不依赖于的属性 getattr 或对象实现细节 考虑下面的代码 我想Proxy委托给Wrapped它无法处理什么 该代码有效 但我想避免测试attr in self dict 我更喜欢一个稳定的接口来执行此
  • 如何使用 SharpDX Toolkit 绘制透明 3D 对象?

    我正在开发一个使用 SharpDX 和 SharpDX Toolkit 来绘制简单 3D 形状的应用程序 Geometrics Desktop 示例对于入门非常有帮助 现在我正在尝试使某些形状透明 并且为了简单起见 我只是尝试使该示例中的茶
  • 复制键盘布局,向上推入底部表格

    当底部工作表打开时 有什么方法可以像 Android 键盘一样手动上推布局 滚动视图或回收器视图或整个活动 或者你可以说我想以底部表格的形式制作一个最小的键盘 不使用任何可编辑视图 100 工作配方 在 BottomSheetFragmen
  • 如何将 Java 客户端连接到 Windows 10 上的 Azure Cosmos db 模拟器,找不到证书

    Problem 我的演示代码客户端无法连接到 Windows 10 上的 Azure Cosmos 模拟器 Steps 我在 Windows 上安装了 Cosmosdb 模拟器 看起来不错 根据文档 我启动了 Windows cert ma
  • 将图像添加到 uitableview 单元格

    我有一个tableview 如何将图像添加到该单元格的左侧 cell imageView image UIImage imageNamed image png 更新 就像 Steven Fisher 所说 这应该只适用于具有 UITable
  • WPF 命令参数绑定问题

    我在理解命令参数绑定的工作原理时遇到一些困难 当我在调用 InitializeComponent 之前创建小部件类的实例时 它似乎工作正常 对 ExecuteCommand 函数中参数 Widget 的修改将 应用 到 widget 这是我
  • 程序如何在Python中的两个函数之间进行选择?

    我有一个 Python 3 2 程序 可以计算未来任意时间段内的投资价值 它可以处理单利和复利 问题是我定义了两个函数 main 和 main2 第一个是简单函数 第二个是复利函数 现在我想做的是 根据用户的一些输入 程序在运行 main
  • 为什么在 ruby​​ 中创建元类?

    我正在尝试了解 Ruby 对象模型 我知道实例方法保存在类中而不是类的对象中 因为它消除了冗余 我读到 每当创建一个类时 也会为新创建的类创建一个元类 元类存储类方法 即该类的单例方法位于元类中 例如 class MyClass def h
  • 这个程序中的“this”是什么意思?

    我正在编写一个程序 然后我在一些使用this这段代码中的关键字 我想知道它的目的是什么 它可以处理 Jbutton 或 JTextField 它可以使用 this 关键字显示消息 发生了什么getSource 这是代码 import jav
  • 如何使用 Selenium Webdriver 自动化验证码? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在为登录页面编写脚本 但我有一个验证码需要处理 Selenium 无法处理验证码 虽然网站出于同样的原因使用验证码 所以没有人可以
  • 导致链接平移并打开地图中的标记

    JSFiddle http jsfiddle net megatimes NVDLf 7 http jsfiddle net megatimes NVDLf 7 我有一张地图 它从数组创建多个标记 地图下方是一些链接 单击这些链接时 我想让
  • 更改 iOS 地图中的图钉方向

    环球银行金融电信协会3 0 MKMAP视图 iOS Note 融合的AppleMap 不与GoogleMap 我做了以下事情 实现地图并将自定义图像添加到用户位置注释 当地图打开时 它会在正确的位置显示用户位置 我的要求 当用户移动到不同方
  • Laravel 5.2 CORS,GET 不适用于预检选项

    可怕的 CORS 错误 跨源请求被阻止 同源策略不允许读取 远程资源位于http localhost mysite api test http localhost mysite api test 原因 CORS 标头 Access Cont
  • 如何防止查询字符串被篡改?

    Hii 我有一个像 http project page1 aspx userID 5 http project page1 aspx userID 5 如果手动更改 userID 参数 该操作将无法执行 这怎么可能 大家好 谢谢您的帮助 我
  • 如何在 Angular 6 单元测试中调试 HeadlessChrome 0.0.0 (Linux 0.0.0) ERROR { "isTrusted": true } ?

    当我运行测试套件时 我在与我一直在使用的单元测试完全不同的单元测试中遇到错误 我做错了什么 HeadlessChrome 0 0 0 Linux 0 0 0 ERROR isTrusted true 然后是一些构建步骤 并在测试执行期间出现
  • 动态创建结构的List<>

    在 C 中 我想创建一个基于动态值类型的列表 例如 void Function1 TypeBuilder tb tb is a value type Type myType tb CreateType List
  • 使用“旧”对象引用使用构建器模式创建新对象

    我正在尝试构建器模式 并陷入如何向新创建的对象添加新 属性 的困境 public class MsProjectTaskData private boolean isAlreadyTransfered private String req