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

我已经最近在博客的想法的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和属性具有完全相同的名称(以及首字母的大小写)。 在代码库中进行文本搜索要容易得多
    • 在类似Scala的语言中,getter看起来就像属性本身一样,由于语言语法糖:“ myBean.myProperty()”和“ myBean.myProperty”,这些属性等效于表达式。
    • Getter和setter在字典顺序上彼此相邻(例如,在IDE的“大纲”视图中)。 这是有道理的,因为财产本身比不采取“获取”和“设置”行动更为有趣。
    • 您不必担心选择“获取”还是“是”。 此外,还有一些属性,无论如何,“ get” /“ is”无论如何都是不合适的,例如,只要涉及“ has”->“ getHasChildren()”或“ isHasChildren()”? 嗯,将其命名为“ hasChildren()”! “ setHasChildren(true)”吗? 不,“ hasChildren(true)”!
    • 您可以遵循简单的命名规则:使用命令式动词来执行动作。 使用第三人称形式的名词,形容词或动词访问对象/属性。 该规则已经证明标准约定存在缺陷。 “获取”是命令形式,而“是”是第三人称形式。
  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很少使用“ get”和“ set”。 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

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

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

相关文章

css:hover伪类的使用

&#xff1a;hover的使用&#xff0c;即当鼠标指针移入元素时&#xff0c;所做出的样式设置 示例一 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>demo01</title><style>*{margin: 0;p…

Redis内存淘汰机制

转自&#xff1a;https://my.oschina.net/andylucc/blog/741965 摘要 Redis是一款优秀的、开源的内存数据库&#xff0c;我在阅读Redis源码实现的过程中&#xff0c;时时刻刻能感受到Redis作者为更好地使用内存而费尽各种心思&#xff0c;例如最明显的是对于同一种数据结构在不…

python字符串常见操作

字符串常见操作 如有字符串mystr hello world itcast and itcastcpp&#xff0c;以下是常见的操作 <1>find 检测 str 是否包含在 mystr中&#xff0c;如果是返回开始的索引值&#xff0c;否则返回-1 mystr.find(str, start0, endlen(mystr))<2>index 跟find()方法…

mysql数据库的体系结构包括什么组件_MySQL数据库的体系结构

MySQL体系结构遵循C/S模型&#xff0c;即客户机/服务器模型&#xff0c;MySQL客户机通过原生的多种接口&#xff0c;可以与MySQL服务器进行交互。MySQL数据库是单进程多线程的架构&#xff0c;同windows平台下的Oracle数据库与全平台下的达梦数据库一样&#xff0c;采取单进程多…

同步多线程集成测试

测试线程非常困难&#xff0c;这使得为要测试的多线程系统编写良好的集成测试非常困难。 这是因为在JUnit中&#xff0c;测试代码&#xff0c;被测对象和任何线程之间没有内置的同步。 这意味着&#xff0c;当您必须为创建并运行线程的方法编写测试时&#xff0c;通常会出现问题…

调整图像的灰度级数C++实现

图像灰度级数我们见得最多的就是256了&#xff0c;如果想调整它的灰度级数&#xff0c;我们可以使用图像库的imadjust函数来作出调整&#xff0c;比如讲256个灰度级变成2个灰度级&#xff08;也就是二值图了&#xff09;。再举一个例子&#xff0c;原来一幅256个灰度级的图像&a…

angular4获得焦点事件_Angular 4 文本框自动获取焦点二

Angular是不推荐直接通过DOM操作获取元素的&#xff0c;要操作元素就通过ViewChild装饰器。在HTML中对元素添加引用myInput&#xff1a;在ts中可以通过ViewChild获取指定元素的引用&#xff1a;import { ViewChild } from angular/core;ViewChild(myInput) input;获取到对应元素…

Bootstrap源码解读之栅格化篇

本文纯属自己研究所写笔记&#xff0c;如果有错误还请多多指教提出 版心(container) 版心&#xff1a;class名为.container的容器&#xff0c;其版心的宽度在各个屏幕设备下是不一样的值&#xff0c;版心两边就是留白。 各尺寸下版心宽度如下表&#xff1a; 屏幕设备版心宽度ma…

EasyCriteria 2.0 – JPA标准应该很容易

在今天的帖子中&#xff0c;我们将看到名为EasyCriteria的框架的新版本。 在这篇文章的结尾&#xff0c;我们将在博客中看到这里的内容。 不幸的是&#xff0c;JPA标准存在一个巨大的问题&#xff0c;即冗长。 为什么不变得更简单&#xff1f; 像这样认为EasyCriteria框架已经诞…

[BZOJ2095][Poi2010]Bridges 最大流(混合图欧拉回路)

2095: [Poi2010]Bridges Time Limit: 10 Sec Memory Limit: 259 MBDescription YYD为了减肥&#xff0c;他来到了瘦海&#xff0c;这是一个巨大的海&#xff0c;海中有n个小岛&#xff0c;小岛之间有m座桥连接&#xff0c;两个小岛之间不会有两座桥&#xff0c;并且从一个小岛…

excel和python建模_利用Excel学习Python:准备篇

写在前面这个系列我们要利用Excel的知识&#xff0c;学会用python进行数据分析&#xff0c;如果你精通Excel想要用python提高数据分析效率&#xff0c;那么这个系列你来对了&#xff0c;如果你已经是python大神&#xff0c;想要建模/算法等高级技巧的&#xff0c;这个系列可能不…

故障公告:IIS应用程序池停止工作造成博客站点无法访问

非常抱歉&#xff0c;今天凌晨博客站点负载均衡中所有3台服务器的IIS应用程序池突然停止工作&#xff0c;造成 1:20-7:45 左右博客站点无法正常访问&#xff0c;由此给您带来很大的麻烦&#xff0c;请您谅解。 服务器操作系统是 Windows Server 2016&#xff0c;对应的 IIS 错误…

前端HTML以及HTML5(基本标签)

前面一章介绍了一下前端的发展&#xff0c;这章简单介绍一下html的发展以及基本的标签。 一、HTML的发展史 1、概念 超文本标记语言&#xff08;HyperText Markup Language&#xff0c;简称HTML&#xff09;是为 [ 网页创建和其他可在浏览器中看到的信息 ] 设计的一种标记语言…

方法内联在JVM中有多积极?

IntelliJ IDEA中使用Ctrl Alt M 提取方法 。 Ctrl Alt M。 这就像选择一段代码并按此组合一样简单。 Eclipse也有它 。 我讨厌冗长的方法。 对于我来说&#xff0c;闻起来太久了&#xff1a; public void processOnEndOfDay(Contract c) {if (DateUtils.addDays(c.getCrea…

Python正则表达式基础

1. 正则表达式基础 1.1. 简单介绍 正则表达式并不是Python的一部分。正则表达式是用于处理字符串的强大工具&#xff0c;拥有自己独特的语法以及一个独立的处理引擎&#xff0c;效率上可能不如str自带的方法&#xff0c;但功能十分强大。得益于这一点&#xff0c;在提供了正则表…

hexdump mysql_linux下mysql数据库定时备份

备份操作命令&#xff1a;mysqldump -uroot --default-character-setutf8 --hex-blob -p123456 test_oa > /usr/software/data_backup/mysql_backup/test.sql以下是完整脚本&#xff0c;加--default-character-setutf8 --hex-blob 防乱码发生。#!/bin/bashdatabasestestus…

新建一个页面

今天我刚好要做一个单页面来展示某些东西。 就一起来看看吧&#xff0c;初学者写的不好请自闭双眼。 先上代码吧&#xff0c;大家看看有什么需要修改的地方。 1 <!DOCTYPE html>2 <html lang"en">3 4 <head>5 <meta charset"UTF-8&q…

Java并发:隐藏线程死锁

大多数Java程序员熟悉Java线程死锁概念。 它本质上涉及2个线程&#xff0c;它们彼此永远等待。 这种情况通常是平面&#xff08;同步&#xff09;或ReentrantLock&#xff08;读或写&#xff09;锁排序问题的结果。 Found one Java-level deadlock:"pool-1-thread-2"…

vue中使用axios发送请求

我们知道&#xff0c;vue2.0以后&#xff0c;vue就不再对vue-resource进行更新&#xff0c;而是推荐axios&#xff0c;而大型项目都会使用 Vuex 来管理数据&#xff0c;所以这篇博客将结合两者来发送请求 1.安装axios cnpm i axios -S 2.方案一&#xff1a;修改原型链 首先&…

django缓存

由于Django是动态网站&#xff0c;所有每次请求均会去数据进行相应的操作&#xff0c;当程序访问量大时&#xff0c;耗时必然会更加明显&#xff0c;最简单解决方式是使用&#xff1a;缓存&#xff0c;缓存将一个某个views的返回值保存至内存或者memcache中&#xff0c;5分钟内…