这是不可变类和 Builder 模式的有效 Java 实现吗?

2023-12-22

Builder 实现 Cloneable 并重写clone(),不可变类保留构建器的私有克隆,而不是复制构建器的每个字段。这使得返回新的构建器并创建不可变实例的稍微修改的副本变得容易。

这条路我可以走

MyImmutable i1 = new MyImmutable.Builder().foo(1).bar(2).build();
MyImmutable i2 = i1.builder().foo(3).build();

据说 Cloneable 接口有些破损,但是这是否违反了良好的 java 编码实践,这个构造有什么问题吗?

final class MyImmutable { 
  public int foo() { return builder.foo; }
  public int bar() { return builder.bar; }
  public Builder builder() { return builder.clone(); }
  public static final class Builder implements Cloneable {
    public Builder foo(int val) { foo = val; return this; }
    public Builder bar(int val) { bar = val; return this; }
    public MyImmutable build() { return new MyImmutable(this.clone()); }
    private int foo = 0;
    private int bar = 0;
    @Override public Builder clone() { try { return (Builder)super.clone(); } catch(CloneNotSupportedException e) { throw new AssertionError(); } }
  }
  private MyImmutable(Builder builder) { this.builder = builder; }
  private final Builder builder;
}

通常,从生成器构造的类没有任何生成器的专业知识。也就是说 Immutable 将有一个构造函数来提供 foo 和 bar 的值:

public final class MyImmutable {
  public final int foo;
  public final int bar;
  public MyImmutable(int foo, int bar) {
    this.foo = foo;
    this.bar = bar;
  }
}

构建器将是一个单独的类:

public class MyImmutableBuilder {
  private int foo;
  private int bar;
  public MyImmutableBuilder foo(int val) { foo = val; return this; }
  public MyImmutableBuilder bar(int val) { bar = val; return this; }
  public MyImmutable build() { return new MyImmutable(foo, bar); }
}

如果需要,您可以向 MyImmutable 构建器添加一个静态方法,以从现有的 MyImmutable 实例开始:

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

这是不可变类和 Builder 模式的有效 Java 实现吗? 的相关文章

  • 清理码头 - 删除“不必要”的东西

    我习惯用Jetty http jetty codehaus org jetty 作为我的网络容器 我对我做了什么安装步骤得到原始的焦油球并且清理一些目录和文件从中 我在这里想提出的是 您通常从 Jetty 中删除什么以在生产 登台环境中使用
  • 未找到 MessageSource 的 ResourceBundle [消息]:找不到基本名称消息的包

    在 applicationContext xml 中 我定义了 MessageSource 如下所示
  • “_加载小部件时出现问题”消息

    加载小部件时 如果找不到资源或其他内容 则会显示 加载小部件时出现问题 就这样 惊人的 此消息保留在主屏幕上 甚至没有说明加载时遇到问题的小部件 我通过反复试验弄清楚了这一点 但我想知道发生这种情况时是否有任何地方可以找到错误消息 Andr
  • 无法使用maven编译java项目

    我正在尝试在 java 16 0 1 上使用 maven 构建 IntelliJ 项目 但它无法编译我的项目 尽管 IntelliJ 能够成功完成 在此之前 我使用maven编译了一个java 15项目 但我决定将所有内容更新到16 0 1
  • 如何从秘密字符串中制作 HMAC_SHA256 密钥以在 jose4j 中与 JWT 一起使用?

    我想生成 JWT 并使用 HMAC SHA256 对其进行签名 对于该任务我必须使用jose4j https bitbucket org b c jose4j wiki Home 我尝试根据秘密生成密钥 SecretKeySpec key
  • Java:使用 HttpURLConnection 的 HTTP PUT

    如何执行 HTTP PUT 我正在使用的类似乎认为它正在执行 PUT 但端点将其视为我执行了 GET 我做错了什么吗 URL url new URL https HttpURLConnection conn HttpURLConnectio
  • eclipse中导入项目文件夹图标

    我在 Eclipse 工作区中新导入的 Maven 项目有J and M项目文件夹顶部的图标 项目和包资源管理器 而其他导入的 Maven 项目只有一个J icon 有人可以解释其中的区别吗 该项目有J装饰器被称为 Java 项目和具有M装
  • 在文本文件中搜索单词并返回其频率

    如何在包含单词文本的文本文件中搜索特定单词并返回其频率或出现次数 使用扫描仪 String text Question how to search for a particular word in a text file containin
  • 使用 RecyclerView 适配器在运行时更改布局屏幕

    我有两个布局文件 如下所示 如果列表中存在数据 则我显示此布局 当列表为空时 我会显示此布局 现在我想在运行时更改布局 当用户从列表中删除最后一项时 我想将布局更改为第二张图片中显示的 空购物车布局 In getItemCount Recy
  • 无法在 Spring Boot 测试中模拟 persistenceContext

    我正在使用带有 Mockito 框架的 spring boot 测试来测试我的应用程序 存储库类 EntityManager 之一作为参考 我的班级如下所示 Repository Transactional Slf4j public cla
  • 如何将 android.net.Uri 转换为 java.net.URL? [复制]

    这个问题在这里已经有答案了 有没有办法从Uri to URL 我正在使用的库需要这个 它only接受一个URL但我需要在我的设备上使用图像 如果该方案的Uri is http or https new URL uri toString 应该
  • 如何获取 WebElement 的父级[重复]

    这个问题在这里已经有答案了 我试过了 private WebElement getParent final WebElement webElement return webElement findElement By xpath 但我得到
  • 列表应该如何转换为具体的实现?

    假设我正在使用一个我不知道源代码的库 它有一个返回列表的方法 如下所示 public List
  • Dispatcher-servlet 无法映射到 websocket 请求

    我正在开发一个以Spring为主要框架的Java web应用程序 特别使用Spring core Spring mvc Spring security Spring data Spring websocket 像这样在 Spring 上下文
  • 如何在 Eclipse Java 动态 Web 项目中使用 .properties 文件?

    我正在 Eclipse 中开发动态 Web 项目 我创建了一个 properties 文件来存储数据库详细信息 用户名 密码等 我通过右键单击项目和 New gt File 添加它 我使用了Java util包Properties类 但它不
  • 解析输入,除了 System.in.read() 之外不使用任何东西

    我很难找到具体的细节System in read 有效 也许有人可以帮助我 似乎扫描仪会更好 但我不允许使用它 我被分配了一个任务 我应该以 Boolean Operator Boolean 的形式读取控制台用户输入 例如T F 或 T T
  • Linux 上有关 getBounds() 和 setBounds() 的 bug_id=4806603 的解决方法?

    在 Linux 平台上 Frame getBounds 和 Frame setBounds 的工作方式不一致 这在 2003 年就已经有报道了 请参见此处 http bugs java com bugdatabase view bug do
  • Java的-XX:+UseMembar参数是什么

    我在各种地方 论坛等 看到这个参数 并且常见的答案是它有助于高并发服务器 尽管如此 我还是找不到 sun 的官方文档来解释它的作用 另外 它是Java 6中添加的还是Java 5中存在的 顺便说一句 许多热点虚拟机参数的好地方是这一页 ht
  • Android - 9 补丁

    我正在尝试使用 9 块图片创建一个新的微调器背景 我尝试了很多方法来获得完美的图像 但都失败了 s Here is my 9 patch 当我用Draw 9 patch模拟时 内容看起来不错 但是带有箭头的部分没有显示 或者当它显示时 这部
  • Android AutoCompleteTextView 带芯片

    我不确定我是否使用了正确的词语来描述此 UI 功能 但我已附上我希望在我的应用程序中实现的目标的快照 它由 Go SMS 使用 用户在编辑文本中键入联系人 在用户从完成下拉列表中选择联系人后 该联系人将被插入到编辑文本中 如附图所示 编辑文

随机推荐

  • 带有匿名方法的BackgroundWorker?

    我要创建一个后台工作者使用匿名方法 我写了以下代码 BackgroundWorker bgw new BackgroundWorker bgw DoWork new DoWorkEventHandler gt int i 0 foreach
  • Matlab函数计算平均邻度

    我尝试搜索 matlab 的函数 该函数给出平均邻度的图表 python 中的 network X 包中有一个相同的函数 所以我想知道matlab中是否有类似的功能 编辑 我无法将其转换为邻接矩阵 这实际上会占用太多空间 我所拥有的是以下边
  • C++ 将源文件中的某些函数设为私有的最佳方法是什么?

    myclass h pragma once void publicFunction myclass cpp include myclass h include
  • Android:如何以编程方式取消 SearchView 的焦点

    我的布局中有一个 SearchView 不在操作栏中 我无法使用通常的方法关闭键盘 public static void hideKeyboard Activity activity InputMethodManager imm Input
  • Firebase 3.x - 令牌/会话过期

    有谁知道令牌需要多长时间才会过期 现在没有选项可以在控制台上设置令牌有效性 自 2016 年 5 月起 Firebase 身份验证登录会话不再过期 相反 他们使用长期帐户令牌和短期自动刷新访问 ID 令牌的组合来获得两全其美的效果 如果你想
  • Spring Boot程序找不到主类

    我有一个程序在 eclipse 中作为 Spring boot 应用程序运行 程序运行良好 然后我做了以下事情 右键单击项目 gt 运行方式 gt Maven 测试 这是偶然的 当我尝试再次将程序作为 Spring Boot 应用程序运行时
  • 解压 1 个变量,剩余到列表中

    我想知道这是否可能 def someFunction return list range 5 first rest someFunction print first 0 print rest 1 2 3 4 我知道可以用这三行来完成 res
  • SQLAlchemy 查询包含多个值中任意一个的数组

    我想我可以在互联网上的某个地方找到这个问题的答案 但我似乎错过了 您可以查询表中数组列包含特定值的所有行 MyModel query filter Mymodel arrayField contains someValue 您可以输入多个值
  • 为什么 SQL Server 选择聚集索引扫描而不是非聚集索引扫描?

    在我正在查询的一个表中 聚集索引是在非主键的键上创建的 我不知道为什么 但是 该表的主键有一个非聚集索引 在执行计划中 SQL 选择聚集索引 而不是我在查询中使用的主键的非聚集索引 SQL 这样做有什么原因吗 如何强制 SQL 选择非聚集索
  • C# 属性命名事件

    我正在使用 Json 序列化程序 需要绑定到一个名为 event 的属性名称 当然 event 是 C 中的关键字 因此请执行以下操作string event get set 不允许 有什么办法去做吗 我无法更改返回给我的对象的名称 假设您
  • 如何从张量流中的两个张量创建频率张量

    我有一个像这样的张量 其中值是频率 行是索引 0 to 6 tf docs 0 2 1 2 2 1 5 0 0 1 7 8 9 6 我有一个常数张量 其中张量的值是索引 tf topics tf constant 1 2 1 3 1 0 2
  • 表单提交导致“InvalidDataException:超出表单值计数限制 1024”。

    我创建了一个 mvc 站点 并且发布了大量的 json 表单数据 Content Type application x www form urlencoded 回到mvc控制器 当我执行此操作时 我收到一条 500 响应 其中指出 Inva
  • 使自定义 Airflow 宏扩展其他宏

    有没有办法在 Airflow 中创建一个用户定义的宏 它本身是根据其他宏计算出来的 from airflow import DAG from airflow operators bash operator import BashOperat
  • React Native 播放来自 IP 摄像机的 RTSP 流 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想在 iOS 设备中通过 IP 网络通过 RTSP 协议播放视频流 h264 我正在使用 React
  • 谷歌地图API,获取用户城市/最近的城市/一般区域

    我一直在尝试编写一个函数 返回一个人所在或附近最合理 规模适中的城市 城镇 地区 yik yak 等应用程序使用这样的算法将人们分组在一起 有没有现有的算法可以做到这一点 目前我正在使用这个 geocoder geocode latLng
  • 使用具有多个结果集的 exec 进行 INSERT INTO

    SQL Server 允许我将存储过程的返回结果集插入为 DECLARE T TABLE ID int Name varchar 255 Amount money INSERT INTO T exec dbo pVendorBalance
  • 如何过滤数组循环中的数据

    在我的数组中是这样的 var myColumnDefs a hh b hh c jk d ggh e hvh a dd b gg d nn e rr f jj 我想过滤数据并将数据插入到新数组中 如下所示 var newarray a b
  • Twitter Streaming API .NET 库 [已关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 按子字段对嵌套序列化器字段的 DRF 序列化器输出进行排序

    我有两个序列化器 其中一个用一个引用另一个many True关系 class AttributeInParentSerializer ModelSerializer masterdata type CharField max length
  • 这是不可变类和 Builder 模式的有效 Java 实现吗?

    Builder 实现 Cloneable 并重写clone 不可变类保留构建器的私有克隆 而不是复制构建器的每个字段 这使得返回新的构建器并创建不可变实例的稍微修改的副本变得容易 这条路我可以走 MyImmutable i1 new MyI