魔术二传手反模式

设置者和获取者是邪恶的。 创建JavaBean定义时,这似乎是个好主意。 但是它们对Java社区造成了很大的伤害。 通常不如null指针那么多,但足够了。

首先,许多初级人员认为实现setter和getter(嘿,在Eclispe中只需单击几下)确实可以正确地封装。 我应该详细说明为什么不这样做吗?

另一件事是使用setter和getter反对YAGNI。 YAGNI代表你不需要它 。 这意味着您不应该开发该项目现在不需要的代码。 要强调的是这个词 。 许多程序员倾向于开发可扩展实际功能并执行比实际需要更通用的功能的代码。 即使从原则上讲它可能是有价值的:在大多数实际情况下却没有。 代码变得更加复杂,另一方面,项目从未发展到需要程序员创建泛化的阶段。

Setter和getter是YAGNI的一个干净,简单且使用非常广泛的示例。 如果setter除了设置字段的值外什么也不做,而getter除了返回字段的值外什么都不做,那为什么我们根本不需要它们呢? 为什么不将字段的访问修饰符更改为setter和getter的值(可能是public )?

答案通常是,您可能需要在getter或setter中实现一些更复杂的功能,然后无需更改bean提供的“接口”。 “ 您可能需要实施 ”一词表明这是YAGNI。 而且,这很危险。 实施setter和getter隐式公开了类的实现。 塞特犬做什么? 设置字段的值。 例如, setBirthDate()通过定义来设置字段birthDate 。 这就是编写调用setter的代码的用户思考的方式。 您可以在JavaDoc中记录setBirthDate()实际上“指定”了出生日期,但是为时已晚。 您将方法命名为设置方法,仅此而已。 没有人阅读JavaDoc。 API规则。

以后,当您更改代码时, setBirthDate()不仅设置生日,甚至不设置生日,也不会通知用户。 更改是无声的,您只是更改了隐式提供给用户的界面。 会有bug,调试会话,新版本,这很好,因为这会创建工作场所(请讽刺,请)。 如果为用户提供对字段的直接访问,则将字段从public移到private访问修饰符的后面将导致编译时错误。 也许这只是一种怪异的个人喜好,但我更喜欢编译时错误而不是错误。 它们更易于修复(阅读:更便宜)。

不用担心:您仍然可以修改您的API。 您仍然可以从方法集中删除您的setter和getter,并迫使其他程序员修复其代码,这些代码隐含地假定setter实际上已经设置并且getter得到了。 拜托

我写这篇文章的真实故事是什么?

从前,有一个物体可以做某事。 要执行其任务,您可以设置字段aaa或字段bbb ,但不能两者都设置。 该应用程序是通过这种方式开发的,并且已经超过六年了。 有一天,一位年轻的程序员公主骑着白马,希望使世界变得更美好。 他想使前面提到的类更安全,并修改了setter setAaa()以使字段bbb nullsetAaa() 。 单元测试大放异彩。 覆盖率为100%。 (我应该学会不撒谎。)他提交了图书馆的新书,几周后他完成了实习,回到学校。 那时应用程序开始使用该库的新版本。 由于这一微小的变化,他们惨遭失败,并退回到了旧版本。 我们所有人都辛苦了,总而言之,由于简单的更改,公司花了大约一年的时间来工作,更不用说程序员从头顶拔下来的头发了。

为什么程序失败了? 有一些代码以这种方式克隆了一个包含aaabbb字段的对象:

BadBean newBadBean = new BadBean();newBadBean.setAaa(oldBadBean.getAaa());newBadBean.setBbb(oldBadBean.getBbb());

你明白了。 在新bean中,字段aaa始终为null

现在您已经阅读了本文,您将永远不会尝试创建一个聪明的二传手。 我知道你不会! 您知道的一句话是: 始终编​​码,就像最终维护您的代码的人是知道您住的地方的暴力精神病患者。 看哪!

翻译自: https://www.javacodegeeks.com/2015/03/the-magic-setter-antipattern.html

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

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

相关文章

sqlwarning mysql_mysql提示[Warning] Invalid (old?) table or database name问题的解决方法

DROP TABLE IF EXISTS [TEMP_TABLE_NAME];create temporary table [TEMP_TABLE_NAME] select col1,col2,... from [TABLE_NAME];alter table [TEMP_TABLE_NAME] add unique idx_col1(col1);经过以上操作中,多次出现该warning问题。通过查询和跟踪调试源码&#xff0…

C语言操作符优先级

转自:http://www.cnblogs.com/xiehy/archive/2010/02/04/1663825.html 优先级 运算符 含 义 要求运算 对象的个数 结合方向 1 () [] -> . 圆括号 下标运算符 指向结构体成员运算符 结构体成员运算符 自左至右 2 ! 逻辑非运算符 1 (单目运算符)…

linux mysql select_MySQL-Select语句高级应用

阅读目录1.1 SELECT高级应用1.2 select中where子句使用1.3 select中ORDER BY子句1.4 LIMIT子句1.5 多表连接查询1.6 Informatica_schema获取元数据1.7 参考文献1.1 SELECT高级应用1.1.1 前期准备工作本次测试使用的是world数据库,由MySQL官方提供下载地址&#xff1…

为AWT的机器人创建DSL

Java SDK附带了java.awt.Robot类,该类允许键盘和鼠标输入的自动化以及屏幕捕获的创建。 如果您想编写一个模拟用户输入的小型测试应用程序,或者只想自动化一些重复文本的输入,则此功能非常有用。 但是您不想每次都编写一个完整的Java应用程序…

Win7下硬盘安装Redhat双系统

Win7下硬盘安装Redhat Linux 形成双系统过程详解 需要软件 EasyBCD2.0 和 linux ISO 系统镜像 RedHat linux下载地址:http://www.linuxidc.com/Linux/2013-01/78017.htm 安装前准备工作: 1 一个 Windows 盘 D E F 任选其一都可以,将其格式化为FAT32 格式…

java rmi漏洞工具_学生会私房菜【20200924】Weblogic WLS核心组件反序列化命令执行突破(CVE20182628)漏洞复现...

学生会私房菜学生会私房菜是通过学生会信箱收集同学们的来稿,挑选其中的优质文档,不定期进行文档推送的主题。本期文档内容为:Weblogic WLS核心组件反序列化命令执行突破(CVE-2018-2628)漏洞复现》作者介绍:ChowChow,一…

Java泛型中的多态

从作为Java程序员的早期开始,我们都知道如何实例化和使用Collection对象。 实例化为具体类的List接口将如下所示。 List myArrayList new ArrayList();如果myArrayList应该仅保存Integer对象,则从Java 5编译器开始,按照Java Generics规范…

ASP.NET伪静态-无法读取配置文件,因为它超过了最大文件大小的解决办法

一直都在使用微软URLRewriter,具体的使用方法我就不多说了,网上文章很多。 但最近遇到一个问题,就是当web.config文件里面设置伪静态规则过多,大于2M的时候,就报错:无法读取配置文件,因为它超过…

java定义list_我的Java Web之路59 - Java中的泛型

本系列文章旨在记录和总结自己在Java Web开发之路上的知识点、经验、问题和思考,希望能帮助更多(Java)码农和想成为(Java)码农的人。目录介绍再谈Java中的类型为什么需要泛型?Java中的泛型泛型类型泛型方法总结介绍还记得我在这篇文章(我的Java Web之路3…

Spring查找方法示例

当一个bean依赖于另一个bean时,我们使用setter属性或通过构造函数注入bean。 getter方法将向我们返回已设置的引用,但是假设您每次调用getter方法时都想要一个依赖bean的新实例,那么您可能将不得不采用另一种方法。 在本文中,我…

mysql判断数字的函数_Mysql必读MySql判断汉字、日期、数字的具体函数

《Mysql必读MySql判断汉字、日期、数字的具体函数》要点:本文介绍了Mysql必读MySql判断汉字、日期、数字的具体函数,希望对您有用。如果有疑问,可以联系我们。MYSQL学习几个平常用的mysql函数,MySql判断汉字、日期、数字的具体函数分享给大家…

编码:可视化位图

在过去的一个月左右的时间里,我每天花费一些时间来阅读Neo4j代码库的新部分,以使其更加熟悉,而我最喜欢的类之一是Bits类,该类可以完成所有底层工作,并且到磁盘。 特别是,我喜欢它的toString方法&#xff…

通过更改透明度使图片为透明

使用AlphaBlend函数 函数功能 该函数用来显示具有指定透明度的图像。函数原型 AlphaBlend(HDC hdcDest,int nXOriginDest,int nYOriginDest,int nWidthDest,int hHeightDest,HDC hdcSrc,int nXOriginSrc,int nYOriginSrc,int nWidthSrc,int nHeightSrc,BLENDFUNCTION blendFunc…

(转)CocoaPods:管理Objective-c 程序中各种第三方开源库关联

在我们的iOS程序中,经常会用到多个第三方的开源库,通常做法是去下载最新版本的开源库,然后拖拽到工程中。 但是,第三方开源库的数量一旦比较多,版本的管理就非常的麻烦。有没有什么办法可以简化对第三方库的管理呢&…

为什么子进程每次执行顺序不一样_看完这篇还不懂Redis的RDB持久化,你来打我...

推荐观看:Redis缓存穿透的终极解决方案,手写布隆过滤器_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​www.bilibili.comP8架构师串讲:Redis,zookeeper,kafka,Nginx等技术_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​w…

Spring XD用于数据提取

Spring XD是一个功能强大的工具,它是一组可安装的Spring Boot服务,可以独立运行,在YARN或EC2之上运行。 Spring XD还包括一个管理UI网站和一个用于作业和流管理的命令行工具。 Spring XD是一组功能强大的服务,可与各种数据源一起使…

JDK 9 REPL:入门

会议是聚会Java名人的好地方。 Devoxx France是与Java语言架构师,前同事和老朋友Brian Goetz( briangoetz )见面的一个机会。 我们谈论了JDK 9,而他全都热衷于REPL。 他提到,尽管Java SE 9中有很多重要功能 &#xff0…

sinaapp mysql连接_手把手教你在新浪云上免费部署自己的网站--连接数据库

看完之后,默认你知道怎么将代码上传到新浪云SAE,并且能够成功运行,连接数据库之前,你必须先创建有一个应用。现在我创建一个名称为sampleone的应用,如下图点击左侧的代码管理,选在右侧创建一个版本然后就会…

HDU-4527 小明系列故事——玩转十滴水 模拟

题意:就是平时玩的十滴水游戏,游戏者拥有一定的水滴,能够滴在某些位置,如果一个点上的体积超过了4就会爆炸,向四周传递一个小水滴。该题就是要求模拟这个过程。 分析:这里有一个问题就是不能够使用递归来处…

win8改win7 教程

新入手的WIN8怎么改成WIN7呢?下面以戴尔Dell V3560 win8换win7系统为例说明: win8改win7本文转自http://jingyan.baidu.com/article/ed2a5d1f2a97ee09f6be17e2.html 第一步:开机过程中不断按F2进入到BIOS,更改bios设置&#xff0c…