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

news2024/10/6 14:29:47

针对构造方法 

重叠构造器模式

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

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章:创建和销毁对象/第1项:考虑静态工厂方法而不是构造函数https://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%AC1%E9%A1%B9%EF%BC%9A%E8%80%83%E8%99%91%E9%9D%99%E6%80%81%E5%B7%A5%E5%8E%82%E6%96%B9%E6%B3%95%E8%80%8C%E4%B8%8D%E6%98%AF%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0.md第02章:创建和销毁对象/第2项:当面临多个参数的构造器时考虑使用构建器https://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项:静态成员类优于非静态成员类https://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项:谨慎设计方法签名https://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)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/666044.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

echarts柱状图数据太多设置滚动条

当你的项目中因数据量太大,导致柱状图数据全部叠在一起不便于看的时候,你们是怎么处理的? 大部分同学可能第一想法就是裁剪一部分数据,仅展示页面最大限度能够展示的数据,这确实是一个好办法,简单快速。但…

【分布式】分布式存储架构

文章目录 一、集中存储结构二、分布式存储2.1 、分布式存储的兴起2.2 、分布式存储的重要性2.3 、分布式存储的种类和比较 三、分布式理论浅析3.1 、一致性和可用性3.2 、数据分布哈希分布( Swift )顺序分布( Bigtable )CRUSH 分布…

模版方法模式在 JDK 及 spring 源码中的引用

模版方法模式 模板方法模式是一种行为设计模式, 它在超类中定义了一个算法的框架, 允许子类在不修改结构的情况下重写算法的特定步骤。 更多有关于模版方法模式的介绍详见:https://refactoringguru.cn/design-patterns/template-method 模版…

【4】tf实现神经网络模型

1 M-P神经元与神经网络前向传输 1.1 训练单个神经元 一个含有两个输入的神经元,指定一个输入x1x21,期望y能输出0.3。要求不断的输入x1x21,然后不断的训练权重w与偏置b值,训练一万次后,再次输入x1与x2输出y的值是否为0.3 # 导入TensorFlow库…

Linux 进程的睡眠和唤醒详解

概要 在Linux中,仅等待CPU时间的进程称为就绪进程,它们被放置在一个运行队列中,一个就绪进程的状 态标志位为 TASK_RUNNING。一旦一个运行中的进程时间片用完, Linux 内核的调度器会剥夺这个进程对CPU的控制权,并且从…

QGIS实现tiff影像栅格数据切片教程

实现栅格切片的方式有很多种,geoserver可以,qgis可以。自己写代码也可以,方式非常多。这篇文章介绍一下如何使用QGIS实现栅格切片。 首先我们要去下载一个qgis软件。下载地址如下: Welcome to the QGIS project! 随后我们打开软件,然后把要切片的栅格数据(tiff文件或者…

【Python 随练】逆序打印数字

题目: 给一个不多于 5 位的正整数,要求: 一、求它是几位数, 二、逆序打印出各位数字。 简介: 在本篇博客中,我们将解决一个关于正整数的问题。根据题目要求,我们需要判断给定的正整数是几位数…

你的仓库VS别人家的仓库,有什么不同?

导读: 近年来,随着新技术的蓬勃发展,企业的仓储管理水平大大提高,PDA、RFID、AGV、立体仓库、智能分拣线等各项新技术的应用层出不穷。然而,着眼于制造型企业,却发现仍有许多仓库处在比较原始、传统、粗放…

[译] DeepSpeed:所有人都能用的超大规模模型训练工具

我们于今年 2 月份发布了 DeepSpeed。这是一个开源深度学习训练优化库,其中包含的一个新的显存优化技术—— ZeRO(零冗余优化器),通过扩大规模,提升速度,控制成本,提升可用性,极大地…

如何绘制甘特图?这个软件来帮你

最好用的甘特图软件是什么?先看效果,再放教程: 这是大家用的比较多的excel做出的甘特图: 这是我做的动态甘特图: 两种方法,分享给大家,按需选择即可。 第一种:用Excel制作甘特图 用…

nx安装cuda与cudnn

本文参考 Jetson xavier nx 安装CUDA10.2,和cudnn8.0_jetson安装cuda_三羊木木的博客-CSDN博客 NX安装cuda和cudnn_nx cuda_viatea的博客-CSDN博客 进入nx系统后,输入 sudo apt-get update 更新源 目录 1 cuda 2 cudnn 1 cuda sudo apt-get ins…

如何注册GitHub账号

一、注册GitHub账号 1、浏览器URL中输入地址: https://github.com/ 2、跳转至GitHub官网 3、点击右上角sign up按钮 4、填写注册信息 这个大意是产品更新时消息会通过邮箱发给你,根据需求选择y or n 5、验证账户 有的小伙伴会出现错误信息 Unable to verify you…

考研算法28天:优化版插入排序(折半插入排序)【二分,插入排序】

算法介绍 算法介绍就是说我们原先写的插入排序的这段代码 for(int i1;i<n;i){//开始向前遍历&#xff0c;如果发现前面的元素比//x大的话&#xff0c;就将前面的元素放到x的后面int x q[i],ji;while( j && q[j-1]>x ){q[j] q[j-1];j--;}q[j] x;}我们里面那层…

Redis_6.2.12下载及安装(CentOS7)

文章目录 Redis安装-CentOS71、下载地址2、下载安装流程2.1 安装依赖2.2 官网下载tar包2.3 进入解压目录并编译2.4 启动Redis服务2.5 全局使用redis-cli、redis-server2.6 防火墙开启6379端口查看防火墙状态以及启动、关闭配置firewalld-cmd开启防火墙端口 3、设置开机自动启动…

SpringBoot集成百度人脸识别

SpringBoot集成百度人脸识别 1、概述2、账号申请账号登录注册创建应用 3、抽取模板工具AipFacePropertiesAipFaceTemplateapplication.yml 4、测试 ​ 人脸识别&#xff08;Face Recognition&#xff09;基于图像或视频中的人脸检测、分析和比对技术&#xff0c;提供对您已获授…

如何使用 SpringBoot 创建 RESTful API

如何使用 SpringBoot 创建 RESTful API SpringBoot是一个流行的Java框架&#xff0c;它可以帮助我们快速构建应用程序。其中&#xff0c;创建RESTful API是SpringBoot的常见用例之一。在本文中&#xff0c;我们将介绍如何使用SpringBoot创建RESTful API。 什么是RESTful API …

不同业务场景、不同数据类型,对应亚马逊云科技不同数据库服务

小小的改变&#xff0c;标志一个新时代的全面开启&#xff0c;一个数据库的云原生时代。前不久&#xff0c;Gartner公布了一组数据&#xff0c;引起了不小的讨论度。在2022年全球数据库管理系统的市场份额排名中&#xff0c;作为纯云厂商的亚马逊云科技&#xff0c;超越了老牌传…

电脑如何录屏?3个方法教您win10电脑怎么录屏!

案例&#xff1a;有时手机录屏满足不了我的录制需求&#xff0c;我需要在电脑上录屏&#xff0c;但我对电脑不是特别熟悉&#xff0c;不知道如何在电脑上录屏。 很多小伙伴想在电脑上录制视频&#xff0c;但又不知道如何操作。win10电脑录屏怎么录&#xff1f;有没有简单且详细…

趋势分享 | 多云时代数据安全面临的挑战

IT 和数据管理研究和咨询公司 EMA&#xff08;Enterprise Management Associates&#xff09;早前发布的一份《多云环境下的数据安全》&#xff08;Data Security in a Multi-Cloud World&#xff09;研究报告&#xff0c;调查了来自十个以上不同行业垂直领域、公司规模在 500 …

Kotlin对象和单例模式:探索这种强大设计模式的好处

Kotlin对象和单例模式&#xff1a;探索这种强大设计模式的好处 在Kotlin中&#xff0c;使用关键字"object"来定义一个单例对象。所谓单例对象&#xff0c;就是在整个应用程序中只有一个实例存在。简单来说&#xff0c;就好像只有一个蜘蛛侠一样&#xff0c;不可能同时…