javabeans_膨胀的JavaBeans –不要在您的API中添加“ Getters”

javabeans

我已经最近在博客的想法的JavaBeans™如何可以扩展以减少在Java世界中,这被广泛接受的公约设立的膨胀。 该文章在DZone上重新发布,并在这里获得了颇具争议的反馈(例如,大多数试图将一些新想法带入Java世界的想法)。 我想回顾一下我在该文章中提出的想法之一,该想法被较少关注,即:

Getter和Setter的命名

为什么每次要操作对象属性时都必须使用那些those肿的“ get” /“ is”和“ set”前缀? 此外,属性的首字母的大小写也发生变化。 如果要对所有用法进行区分大小写的搜索

属性,则必须编写一个正则表达式。 我特别难以理解为什么我们应该在各处使用吸气剂。 Getters / setters是提供对属性访问的抽象的约定。 即,您通常总是在写这样的愚蠢的东西:

public class MyBean {private int myProperty;public int getMyProperty() {return myProperty;}public void setMyProperty(int myProperty) {this.myProperty = myProperty;}
}

好。 让我们接受的是,这似乎是我们作为Java开发人员的日常生活,编写了所有这些文章,而不是使用标准的关键字或注释。 我说的是标准,而不是Project Lombok等专有的东西。 接受生活事实后,让我们看一下java.io.File以获得更多详细信息。 对我来说,这是一个很好的例子,其中JavaBean-o-mania™完全错误。 为什么? 查看此源代码摘录:

public class File {// This is the only relevant internal property. It would be 'final'// if it wasn't set by serialisation magic in readObject()private String path;// Here are some arbitrary actions that you can perform on this file.// Usually, verbs are used as method names for actions. Good:public boolean delete();public void deleteOnExit();public boolean mkdir();public boolean renameTo(File dest);// Now the fun starts!// Here is the obvious 'getter' as understood by JavaBeans™public String getPath();// Here are some additional 'getters' that perform some transformation// on the underlying property, before returning itpublic String getName();public String getParent();public File getParentFile();public String getPath();// But some of these 'transformation-getters' use 'to', rather than// 'get'. Why 'toPath()' but not 'toParentFile()'? How to distinguish// 'toPath()' and 'getPath()'?public Path toPath();public URI toURI();// Here are some 'getters' that aren't really getters, but retrieve// their information from the underlying filepublic long getFreeSpace();public long getTotalSpace();public long getUsableSpace();// But some of the methods qualifying as 'not-really-getters' do not// feature the 'get' action keyword, duh...public long lastModified();public long length();// Now, here's something. 'Setters' that don't set properties, but// modify the underlying file. A.k.a. 'not-really-setters'public boolean setLastModified(long time);public boolean setReadable(boolean readable);public boolean setWritable(boolean writable);// Note, of course, that it gets more confusing when you look at what// seem to be the 'not-really-getters' for the abovepublic long lastModified();public boolean canRead();public boolean canWrite();
}

困惑? 是。 但是,我们所有人最终都以这种方式做事,一次又一次。 jOOQ没什么不同,尽管将来的版本将解决此问题。

如何改善事情

并非所有的库和API都存在这种缺陷。 Java已经走了很长一段路,并且已经由许多对此主题有不同看法的人编写。 此外,Java极具向后兼容性,因此我认为JDK如果是从头开始编写的,那么它仍然不会遭受“ JavaBean-o-mania™”的严重影响。 因此,这里有一对夫妇的规则可以遵循在新的API,把事情有点清理:

  1. 首先,决定你的API将主要用于弹簧重或JSP / JSF重环境或任何其他环境中使用的JavaBeans™的表达语言,在那里你真的遵循标准的约定使用。 但是,在这种情况下,请严格遵循约定,并且不要命名任何类似这样的信息检索方法:“ File.length()”。 如果您遵循此范式,则所有方法都应以动词开头,绝不能以名词/形容词开头
  2. 以上内容仅适用于少数几个库,因此,如果要访问不是属性的对象,则可能永远不要使用“ get”。 只需使用属性名称(名词,形容词)。 在呼叫站点上,这看起来会更加精简,尤其是如果您的库使用的是Scala之类的语言时。 这样,“ File.length()”是一个不错的选择,就像“ Enum.values()”一样,而不是“ File.getLength()”或“ Enum.getValues()”。
  3. 如果要访问属性,则可能也不要使用“ get” /“ set”。 Java可以轻松地将名称空间用于属性/方法名称。 只需在getter / setter中使用属性名称本身即可,如下所示:
    public class MyBean {private int myProperty;public int myProperty() {return myProperty;}public void myProperty(int myProperty) {this.myProperty = myProperty;}
    }

    不过,请再次考虑第一个规则。 如果要使用Spring配置bean,则别无选择。 但是,如果您不需要Spring,则上述内容将具有以下优点:

    • 您的getter,setter和属性具有完全相同的名称(以及首字母的大小写)。 在代码库中进行文本搜索要容易得多
    • 该getter看起来像Scala这样的语言中的属性本身一样,由于使用了语言语法糖:“ myBean.myProperty()”和“ myBean.myProperty”,这些属性等效于表达式。
    • Getter和setter在字典顺序上紧挨着(例如,在IDE的“大纲”视图中)。 这是有道理的,因为财产本身比不采取“获取”和“设置”行动更为有趣。
    • 您无需担心选择“获取”还是“是”。 此外,还有一些属性,无论如何,“ get” /“ is”无论如何都是不合适的,例如,只要涉及“ has”->“ getHasChildren()”或“ isHasChildren()”? 嗯,将其命名为“ hasChildren()”! “ setHasChildren(true)”吗? 不,“ hasChildren(true)”!
    • 您可以遵循简单的命名规则:使用命令式动词来执行动作。 使用第三人称形式的名词,形容词或动词访问对象/属性。 该规则已经证明标准约定存在缺陷。 “ get”是命令形式,而“ is”是第三人称形式。
  4. 考虑在设置器中返回“ this”。 有些人喜欢方法链:
    public MyBean myProperty(int myProperty) {this.myProperty = myProperty;return this;}// The above allows for things likemyBean.myProperty(1).myOtherProperty(2).andThen(3);

    或者,返回先前的值,例如:

    public int myProperty(int myProperty) {try {return this.myProperty;}finally {this.myProperty = myProperty;}}

    下定决心并选择以上任一选项,以确保整个API保持一致。 在大多数情况下,方法链接没有实际结果值有用。

    无论如何,将“ void”作为返回类型浪费了API范围。 具体来说,考虑Java 8的lambda语法用于带/不带返回值的方法(取自Brian Goetz的lambda表示状态 ):

    // Aaaah, Callables without curly braces nor semi-colons
    blocks.filter(b -> b.getColor() == BLUE);// Yuck! Blocks with curly braces and an extra semi-colon!
    blocks.forEach(b -> { b.setColor(RED); });// In other words, following the above rules, you probably
    // prefer to write:
    blocks.filter(b -> b.color() == BLUE).forEach(b -> b.color(RED));

    Java 8上线(对于那些维护公共API的人)之后,现在考虑一下这可能是您的API在竞争中的决定性优势。

  5. 最后, 一定要使用“获取”和“设置”里你真的想强调语义称为“渐”和“设置”的行动 。 这包括在以下类型上获取和设置对象:
    • 清单
    • 地图
    • 参考资料
    • ThreadLocals
    • 期货
    • 等等…

    在所有这些情况下,“获取”和“设置”都是操作,而不是属性访问。 这就是为什么您应该使用诸如“ get”,“ set”,“ put”等动词之类的原因。

摘要

设计API时要有创造力。 不要严格遵循JavaBeans™和Spring对整个行业施加的无聊规则。 访问对象/属性时,最新的JDK API以及Google / Apache著名的API很少使用“获取”和“设置”。 Java是一种静态的类型安全语言。 表达式语言和注入配置是我们日常工作中的例外。 因此,我们应该针对我们处理最多的用例优化API。 更好的是,如果Spring将他们的思维方式调整为漂亮,精简,漂亮和有趣的API,而不是强迫Java世界使用诸如getter和setter之类的无聊东西来夸大他们的API!

参考: Bloated JavaBeans –不要通过JAVA,SQL和JOOQ博客上的JCG合作伙伴 Lukas Eder 向您的API添加Getter 。

翻译自: https://www.javacodegeeks.com/2013/02/bloated-javabeans-dont-add-getters-to-your-api.html

javabeans

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

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

相关文章

uniapp 子组件 props拿不到数据_来吧!一文彻底搞定Vue组件!

点击蓝色 “达达前端小酒馆” 关注我哦!加个 “星标” ,每天一篇文章,一起学编程作者 | Jeskson来源 | 达达前端小酒馆Vue组件的概述组件是什么呢,了解组件对象的分析,Vue组件中的data属性,props传递数据的原理到底是…

csp-s模拟测试41「夜莺与玫瑰·玫瑰花精·影子」

夜莺与玫瑰 题解 联赛$T1$莫比乌斯$\%\%\%$ $dead$ $line$是直线 首先横竖就是$nm$这比较显然 枚举方向向量 首先我们枚举方向向量时只枚举右下方向,显然贡献$*2$就是所有斜着的直线 $i,j$表示当自己向右$i$个单位长度,向下$j$单位长度 我们相同斜率下只算最短的线贡献,(因为其…

春天重试,因为冬天来了

好的,这实际上与冬天无关,众所周知,冬天已经到了 。 它是关于Spring Retry的,Spring是一个小的Spring框架库,它使我们可以将重试功能添加到应可重试的任何任务中。 这里有一个很好的教程 ,解释了如何设置简…

python做些什么项目_Python 的练手项目有哪些值得推荐

1 Web方向的练手项目 这个其实是肯定不用多少的了。Python的练手项目就是可以做一个网站了。我们可以做一个属于自己的博客。在做博客的时候,我们可以巩固的知识点是 HtmlCSSJS的基础知识,以及熟练的运用Python的Web开发框架(例如Django或者F…

删除某个时间段之前的文件

/* * 删除文件夹下$n分钟前创建的文件 * param $dir 要处理的目录,物理路径,结尾不加\ * param $n 过期时间,单位为分钟 * return void */function z_del_file_by_ctime($dir,$n){ if(is_dir($dir)){ if($dhopendir($dir)){ …

技术管理规划-路径跟资源

背景 评估团队的投入和产出或者给上级做汇报,都需要弄清楚需要投入多少资源,而资源主要跟两个因素息息相关,即团队目标,此外还有路径和手段; 增加人力前的三个问题? 1.资源的丰富性? 人&#xf…

python保存代码_python入门(5)使用文件编辑器编写代码并保存执行

原博文 2017-04-21 17:21 − python入门(5)使用文件编辑器编写代码并保存执行 两款文本编辑器: 一个是Sublime Text,免费使用,但是不付费会弹出提示框: 一个是Notepad,免费使用,有中…

lucene索引搜索_Lucene –快速添加索引和搜索功能

lucene索引搜索什么是Lucene? Apache LuceneTM是完全用Java编写的高性能,功能齐全的文本搜索引擎库。 它是一项适用于几乎所有需要全文本搜索的应用程序的技术,尤其是跨平台。 Lucene可以纯文本,整数,索引PDF&#xf…

从graphql endpoint获取schema文件

graphql server端有更新,client端需要重新获取schema文件用于创建新的api request,下面简要记录如何从graphql endpoint获取schema文件 You can simply install the CLI using npm or yarn by running the following command. This will add the graphql…

pythonclass全局变量_python的局部变量,全局变量,类变量,实例变量

定义: a、全局变量:在模块内、在所有函数外面、在class外面,这就是全局变量。 b、局部变量:在函数内、在class的方法内(未加self修饰的),这就是局部变量。 c、 静态变量:在class内的…

使用JUnit 5测试异常

JUnit 5带来了令人敬畏的改进,它与以前的版本有很大的不同。 JUnit 5在运行时需要Java 8,因此Lambda表达式可以在测试中使用,尤其是在断言中。 这些断言之一非常适合测试异常。 设置项目 为了演示JUnit 5的用法,我使用了我的长期…

pytorch list转tensor_点赞收藏:PyTorch常用代码段整理合集

机器之心转载来源:知乎作者:张皓众所周知,程序猿在写代码时通常会在网上搜索大量资料,其中大部分是代码段。然而,这项工作常常令人心累身疲,耗费大量时间。所以,今天小编转载了知乎上的一篇文章…

csp-s模拟测试42「世界线·时间机器·密码」

$t3$不会 世界线 题解 题目让求的就是每个点能到点的数量$-$出度 设每个点能到的点为$f[x]$ 则$f[x]x \sum\limits_{y}^{y\in son[x]} U f[y]$ 用$bitset$优化一下即可,但单纯这样会炸内存,随意$yy$一下,时间换空间,像平衡树一样开个垃圾桶都行 代码 #include<bits/stdc.h&g…

python中的命名空间_深入理解Python中的命名空间和范围

Python中的命名空间和范围 在Python中&#xff0c;每个包、模块、类、函数和方法函数都拥有一个“名称空间”&#xff0c;其中解析了变量名称。下面本篇文章就来带大家认识一下Python中的命名空间和范围&#xff0c;希望对大家有所帮助。什么是命名空间&#xff1a; 命名空间是…

ubuntu16.04安装MATLAB R2017b步骤详解(附完整破解文件包)

https://blog.csdn.net/qq_32892383/article/details/79670871 转载于:https://www.cnblogs.com/BambooEatPanda/p/11523727.html

lisp将图元追加选择_汕尾幸运儿喜爱大乐透 两次买彩票就擒获8注追加二等奖254万元...

6月26日&#xff0c;中国体育彩票大乐透第19073期开奖&#xff0c;前区开出号码04﹑11﹑19﹑20﹑24&#xff0c;后区开出号码08﹑11。当期送出头奖2注&#xff0c;二等奖176注&#xff0c;其中汕尾一位幸运儿陈先生(化名)擒得追加二等奖8注&#xff0c;喜获奖金2541434元。两次…

什么是JAX-RS注释? (第3部分)

JAX-RS注释概述&#xff08;第3部分&#xff09; 这是一个由三部分组成的系列&#xff0c;介绍了用于实现REST端点的注释。 在JAX-RS批注的第二部分中&#xff0c;您了解了&#xff1a; Path注释和PathParam QueryParamter批注 Produces批注 Consumes批注 在这一部分中&a…

csp-c模拟测试43「A·B·C」

B 题解 $f[i][(gcd(prime[j]*prime[k]\%P,P))]\sum\limits_{k1}^{k<num} f[i-1][k]*phi(\frac{P}{prime[j]})$ 关于$phi(\frac{P}{prime[j]})$理解 $phi(\frac{P}{prime[j]})$是求$prime[j]$代表的数的个数 $Pk_0*prime[j]$ $x_1k_1*prime[j]$ $x_2k_2*prime[j]$ ....... 要…

小甲鱼python全部视频_小甲鱼全套教程之Python系列视频教程

Python 当前位置&#xff1a;主页 > 编程教程 > Python > 小甲鱼全套教程之Python系列视频教程 小甲鱼全套教程之Python系列视频教程 教程大小&#xff1a; 发布时间&#xff1a;2015-04-18   下载次数&#xff1a;次 本套小甲鱼全套教程之Python系列视频教程是比较…

如何有效开展小组教学_高效课堂 有效教学 | 教育部专家到徐州市第三中学开展教研活动...

原标题&#xff1a;高效课堂 有效教学 | 教育部专家到徐州市第三中学开展教研活动前言2020年12月1日&#xff0c;教育部基础教育课程教材发展中心徐州调研暨徐州市2020年高中语文教师“深度学习”研讨活动、徐州市2020年高中化学骨干教师“三新”培训在徐州市第三中学举办。参加…