《effective java》中关于解决构造函数/方法签名包含大量参数的解决方法

2023-11-20

针对构造方法 

重叠构造器模式

重叠构造器模式是一种编程中的反模式,指的是一个类有多个构造函数,每个构造函数都有不同数量的参数,从而可以根据不同的情况创建对象。这种方式会导致代码可读性和可维护性降低,因为构造函数过多,参数顺序容易混淆。

JavaBeans模式

可以用一个无参的构造函数来创建对象,然后用set方法来设置各个参数,从而避免多个构造函数。

Javabean模式的优点是:

  • 可以提高代码的复用性和可维护性
  • 可以通过反射机制实现对象的自动装配和操作
  • 可以与其他技术如JSP、EJB等进行集成和交互

Javabean模式的缺点是:

  • 需要编写大量的get和set方法
  • 增加了代码量和出错的可能性
  • 需要实现Serializable接口,可能会影响性能和安全性
  • 违背了可变性最小化原则

构建器模式

可以用一个可变的辅助类来设置对象的各个参数,然后用一个不可变的类来复制这些参数,从而避免多个构造函数或者多个set方法

缺点:这个模式也有风险,比如建造builder对象本身就消耗资源,而且相比于重叠构造器(telescope constructor),这个模式显得啰嗦了。所以用不用这个模式本质上需要权衡利弊,书中建议当参数比较多(大于5个),或者考虑到未来可能扩展参数时,考虑用builder模式。

针对普通方法

拆分成多个方法

每个方法只需要包含一种子集,通过提升正交性可以减少方法数目。例如java.util.List接口,它并没有提供子列表sublist中查找元素第一个索引和最后一个索引的方法,这两个方法都需要三个参数。相反,它提供了subList方法,这个方法带有两个参数,并返回子列表的一个视图,这个方法可以与indexOf或者lastIndexOf方法结合起来,获得期望的结果。而这两个方法分别只有一个参数,而且subList可以和其他针对list实例操作的方法结合,这样的API有很高的功能-权重(power-to-weight)比

创建辅助类

一个频繁出现的参数序列可以被看做代表某个独特的实体,比如一个表示表示纸牌游戏的类,如果需要经常传递点数和花色两个双参数,就可以增加辅助类表示一张纸牌,并把每个参数序列都换成辅助类的单个参数。

构建器模式

从对象构建和方法调动都采用builder模式,如果方法带有多个参数且多个都是可选的,最好顶一个对象表示多有参数,并允许客户端在这个对象上进行多次setter调动,每次调用都会设置一个参数,或者设置一个较小的相关集合。设置完所有参数后,客户端就调用对象的执行execute方法,它对参数进行最终有效性检查,并执行实际的计算。

参考一:嵌套类(Java™ 教程> 学习Java语言>类和对象) (oracle.com)

参考二:《effective java》第02章:创建和销毁对象/第2项:当面临多个参数的构造器时考虑使用构建器icon-default.png?t=N7T8https://gitee.com/lin-mt/effective-java-third-edition/blob/master/%E7%AC%AC02%E7%AB%A0%EF%BC%9A%E5%88%9B%E5%BB%BA%E5%92%8C%E9%94%80%E6%AF%81%E5%AF%B9%E8%B1%A1/%E7%AC%AC2%E9%A1%B9%EF%BC%9A%E5%BD%93%E9%9D%A2%E4%B8%B4%E5%A4%9A%E4%B8%AA%E5%8F%82%E6%95%B0%E7%9A%84%E6%9E%84%E9%80%A0%E5%99%A8%E6%97%B6%E8%80%83%E8%99%91%E4%BD%BF%E7%94%A8%E6%9E%84%E5%BB%BA%E5%99%A8.md

第04章:类和接口/第24项:静态成员类优于非静态成员类icon-default.png?t=N7T8https://gitee.com/lin-mt/effective-java-third-edition/blob/master/%E7%AC%AC04%E7%AB%A0%EF%BC%9A%E7%B1%BB%E5%92%8C%E6%8E%A5%E5%8F%A3/%E7%AC%AC24%E9%A1%B9%EF%BC%9A%E9%9D%99%E6%80%81%E6%88%90%E5%91%98%E7%B1%BB%E4%BC%98%E4%BA%8E%E9%9D%9E%E9%9D%99%E6%80%81%E6%88%90%E5%91%98%E7%B1%BB.md第08章:方法/第51项:谨慎设计方法签名icon-default.png?t=N7T8https://gitee.com/lin-mt/effective-java-third-edition/blob/master/%E7%AC%AC08%E7%AB%A0%EF%BC%9A%E6%96%B9%E6%B3%95/%E7%AC%AC51%E9%A1%B9%EF%BC%9A%E8%B0%A8%E6%85%8E%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%B3%95%E7%AD%BE%E5%90%8D.md

参考三:还在new对象吗?试试静态工厂方法--Effective Java第二章 - 知乎 (zhihu.com)

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

《effective java》中关于解决构造函数/方法签名包含大量参数的解决方法 的相关文章

  • 我在socket上设置了超时,发现这个值不能大于21

    我在socket上设置了超时 该值小于21秒才有效 21秒后发现超时还是21秒 public static void main String args SimpleDateFormat sdf new SimpleDateFormat yy
  • Java - 如何将特殊字符放入字符串中

    Java 似乎有很好的字符串处理能力 尽管如此 我还是遇到了最简单的问题 我需要动态字符串 它们在运行时更改 因此字符串类型不是一个好的选择 因为它们是不可变的 所以我使用字符数组 设置起来有点痛苦 但至少它们是可以修改的 我想创建一个字符
  • 在Java中使用命令行编译多个包

    您好 我一直在使用 IDE 但现在我需要从命令行运行和编译 问题是我有多个软件包 我试图找到答案 但没有任何效果 所以我有 src Support java files Me java files Wrapers java files 你知
  • 使用 HttpUrlConnection Android 将 base64 编码的图像发送到服务器

    我正在尝试使用 HttpUrlConnection 将 base64 编码的图像发送到服务器 我遇到的问题是大多数图像均已成功发送 但有些图像会生成 FileNotFound 异常 我的图像编码代码可以在下面找到 public static
  • jvm 次要版本与编译器次要版本

    当运行使用具有相同主要版本但次要版本高于 JVM 的 JDK 编译的类时 JVM 会抛出异常吗 JDK 版本并不重要 类文件格式版本 http blogs oracle com darcy entry source target class
  • 使用 Java 在 WebDriver 中按 Ctrl+F5 刷新浏览器

    我已经使用 java 刷新了 WebDriver 中的浏览器 代码如下 driver navigate refresh 如何使用 Java 在 WebDriver 中按 Ctrl F5 来做到这一点 我认为您可以使用 WebDriver 和
  • RMI 中的引用传递问题? [复制]

    这个问题在这里已经有答案了 有人可以告诉我我错在哪里 为什么这个 RMI 聊天应用程序不起作用 目标是通过远程对象或序列化对象实现客户端 服务器和逻辑之间的解耦 import javax swing import java awt even
  • java.lang.LinkageError:尝试重复的类定义

    为什么会发生错误以及如何修复它 02 13 02 pool 4 thread 2 WARN Exception in thread pool 4 thread 2 02 13 02 pool 4 thread 2 WARN java lan
  • 正则表达式获取字符串中的第一个数字和其他字符

    我是正则表达式的新手 想知道如何才能只获取字符串中的第一个数字 例如100 2011 10 20 14 28 55 在这种情况下 我希望它返回100 但该数字也可以更短或更长 我在想类似的事情 0 9 但它单独获取每个数字 100 2001
  • 字符串池可以包含两个具有相同值的字符串吗? [复制]

    这个问题在这里已经有答案了 字符串池可以包含两个具有相同值的字符串吗 String str abc String str1 new String abc Will the second statement with new operator
  • JFace ColumnWeigthData 导致父级增长

    我有一个 Eclipse RCP 应用程序 并且想要在TableViewer using ColumnWeigthData as ColumnLayoutData 问题是父表单 ScrolledForm在示例代码中 每当我布局表格时都会增加
  • 当您在数组列表上调用remove(object o)时,它如何比较对象?

    当您在 java 中的数组列表上调用remove object o 时 它如何比较对象以找到要删除的正确对象 它使用指针吗 或者它使用 Comparable 接口来比较对象吗 ArrayList remove 依赖于对象的实现Equal方法
  • JSch中如何设置文件类型和文件传输模式?

    我使用 Apache Common NetFTPClient并设置了我的ftpClient在上传文件之前使用如下所示的方法 ftpClient setFileType FTP BINARY FILE TYPE ftpClient setFi
  • 改变for循环的顺序?

    我遇到一种情况 我需要根据用户输入以不同的顺序循环遍历 xyz 坐标 所以我是 3D 空间中的一个区域 然后是一组像这样的 for 循环 for int x 0 x lt build getWidth x for int y 0 y lt
  • 如何在Java媒体框架中学习.wav持续时间?

    我正在尝试使用 java 媒体框架将 mov 文件与 wav 文件合并 因此我需要知道它们的持续时间 我怎样才能做到这一点 任何想法 将不胜感激 您可以使用以下方式了解声音文件的持续时间 即 VitalyVal 的第二种方式 import
  • 如何初始化静态地图?

    你会如何初始化静态Map在Java中 方法一 静态初始化方法二 实例初始化 匿名子类 或者 还有其他方法吗 各自的优点和缺点是什么 这是说明这两种方法的示例 import java util HashMap import java util
  • 如何解决 PDFBox 没有 unicode 映射错误?

    我有一个现有的 PDF 文件 我想使用 python 脚本将其转换为 Excel 文件 目前正在使用PDFBox 但是存在多个类似以下错误 org apache pdfbox pdmodel font PDType0Font toUnico
  • 为什么这个私人浮动字段变为零?

    我有一些奇怪的行为 我很难向自己解释 称为 textureScale 的浮点字段变为零 如果某些代码正在更改该值 则可以解释这一点 然而 我希望能够通过将其设置为 私有最终浮点 来导致构建失败 或者至少是运行时异常 那么无论更改该值都将失败
  • Java:使用 Graph API 在线更新 Sharepoint 上的 docx 文件

    我在使用 Java 在线更新 Sharepoint 上的 docx 文件时遇到问题 首先 我检查了构建 PUT 请求的 URL 此处 并使用此请求 PUT drives drive id items item id content 我首先使
  • 为什么应该首选 Java 类的接口?

    PMD https pmd github io 将举报以下违规行为 ArrayList list new ArrayList 违规行为是 避免使用 ArrayList 等实现类型 而是使用接口 以下行将纠正违规行为 List list ne

随机推荐

  • Android面试题内存&性能篇

    Android面试题内存 性能篇 由本人整理汇总 后续将继续推出系列篇 如果喜欢请持续关注和推荐 更多内容可以关注微信公众号 Android高级编程 android tech 系列文章目录 Android面试题View篇 Android面试
  • Linux下Memcached的安装步骤

    一 安装gcc yum y install gcc 二 安装libevent wget http www monkey org provos libevent 2 0 12 stable tar gz tar zxf libevent 2
  • 记录下sudo: export: command not found的原因

    今天设置环境变量 输入以下命令 sudo export PATH PATH 路径 路径为arm linux gcc的bin目录 结果提示 sudo export command not found 在网上搜了一下 网友给出了答案 原理是ex
  • vue+java实现在线播放mp4视频

    首先如果本地的mp4视频可以播放 但是在网页就显示视频格式不正确 可能原视频不是mp4格式的 更改后缀名为mp4了 但是在网页上还是无法播放 可以用 ffmpeg转换视频格式 一般遇到格式问题都是视频格式不对 需要专门的工具来转换 java
  • 《Linux系统调用:localtime,setlocale》

    一 介绍 时区 不同国家 有的甚至是同一国家不同地区 使用不同的时区和夏时制 对于要输入和输出时间的程序来说 必须对系统所处的时区和夏时制加以考虑 所有的细节已经由C语言库包办了 时区的定义 时区信息繁琐又多 出于这个原因系统没有将其直接编
  • 【ES6】Reflect反射机制

    文章目录 一 Reflect概述 二 用法详解 1 Object gt Reflect 2 修改Object方法的返回结果 3 命令式操作 gt 函数式操作 4 与Proxy对象的方法一一对象 5 apply 总结 一 Reflect概述
  • xshell如何连接远程服务器

    1 打开xshell后 点击新建 gt 会话 2 名称可以随意写 主机需要按照要求填写 远程服务器的IP在这里找 3 点击用户身份验证 4 按照要求填写用户名和密码 5 点击确定后 如果出现下面的命令则说明连接成功 6 再次打开xshell
  • 2021 CCF大数据与计算智能大赛个贷违约预测top 73 解决方案

    目录 一 概述 二 解题过程 2 1 数据 2 2 构建基线 2 3 进阶思路一 2 4 进阶思路二 2 5 进阶思路三 2 6 融合 2 7 调优提分过程 2 8 其他工作 三 结语 一 概述 这是我第二次参加大数据类型的竞赛 也是第一次
  • 如何在Word中粘贴出好看的代码

    文章目录 前言 使用highlightcode实现 总结 前言 每到毕业设计时 论文中一大段一大段的代码阅读起来很难受 这还是python代码 相对比较短 如果是STM32相关代码 看起来更难受 有没有一种办法让代码看起来舒服一些呢 使用h
  • java 数组的长度_Java如何获取数组和字符串的长度(length还是length())

    限时 1 秒钟给出答案 来来来 听我口令 Java 如何获取数组和字符串的长度 length 还是 length 在逛 programcreek 的时候 我发现了上面这个主题 说实话 我当时脑海中浮现出了这样一副惊心动魄的画面 面试官老马坐
  • python中添加空白和删除空白

    添加空白的方法 制表符 字符组合 t 换行符 字符组合 n 删除空白 方法名 功能 rstrip 剔除末尾的空白 lstrip 剔除开头的空白 strip 剔除两端的空白 在实际程序中 这些剥除函数最长用于在存储用户输入前对其进行清理
  • 时序预测

    时序预测 MATLAB实现TCN LSTM时间卷积长短期记忆神经网络时间序列预测 目录 时序预测 MATLAB实现TCN LSTM时间卷积长短期记忆神经网络时间序列预测 预测效果 基本介绍 模型描述 程序设计 参考资料 预测效果 基本介绍
  • win10下的anaconda安装pymysql

    1 打开anaconda的终端 即 anaconda prompt 2 输入命令 pip install pymysql ps 其余包都可以使用pip install xxx来完成安装 若下载失败 可在一下链接查找相关包进行安装 https
  • Java 单例模式、工厂模式、代理模式

    文章目录 单例模式 概念 单例模式的类型 破坏单例模式 枚举实现单例模式 工厂模式 概述 简单工厂模式 工厂方法 抽象工厂 代理模式 Proxy 概述 静态代理 动态代理 单例模式 概念 单例模式指在内存中创建对象且仅创建一次的设计模式 在
  • 《Pyramid Scene Parsing Network》

    Pytorch代码 1 研究问题 目前基于FCN的语义分割网络缺乏利用不同尺度全局上下文信息的能力 对于复杂图像的语义分割 如ADE20K数据集 存在问题 注 感受野的大小可以粗略表示为使用上下文信息的程度 2 研究方法 提出了金字塔场景理
  • Mybatis的常用注解

    加载配置文件的时候 绝对路径和相对路径的写法都不太好用 我们经常使用的两种方法第一种就是使用类加载器 他只能读取类路径的配置文件 第二种就是使用ServletContext对象的getRealPath 函数 mybatis的常用注解 1 与
  • jsp+servlet+ajax实现登录

    该案列使用jsp servlet ajax实现登录 页面简洁大方 弹框都是封装的插件 整体案列采用三层的模式 链接数据库方面用的是dbcp的链接池 数据库时mysql 运行效果如下图 下载地址 jsp servlet ajax实现登录案例
  • c++(对象赋值与拷贝构造函数)

    对象赋值 同一个类的对象之间可以相互赋值 默认情况下 进行的是对象成员之间的复制 也称为 按位复制 或 浅复制 当类的数据成员中没有指针类型的变量时 直接对两个对象进行赋值没有问题 但是一旦类的数据成员含有指针变量 那么直接对这两个对象进行
  • MySQL常用基础 - 小白必看(二)

    MySQL数据库基本操作 一 DDL 概念 是一个数据定义语言 该语言部分包括 1 对数据库的常用操作 创建数据库 1 create database 数据库名 直接删除 2 create database if not exists 数据
  • 《effective java》中关于解决构造函数/方法签名包含大量参数的解决方法

    针对构造方法 重叠构造器模式 重叠构造器模式是一种编程中的反模式 指的是一个类有多个构造函数 每个构造函数都有不同数量的参数 从而可以根据不同的情况创建对象 这种方式会导致代码可读性和可维护性降低 因为构造函数过多 参数顺序容易混淆 Jav