日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

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

發(fā)布時(shí)間:2023/12/3 java 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 javabeans_膨胀的JavaBeans –不要在您的API中添加“ Getters” 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

javabeans

我已經(jīng)最近在博客的想法的JavaBeans?如何可以擴(kuò)展以減少在Java世界中,這被廣泛接受的公約設(shè)立的膨脹。 該文章在DZone上重新發(fā)布,并在這里獲得了頗具爭(zhēng)議的反饋(例如,大多數(shù)試圖將一些新想法帶入Java世界的想法)。 我想回顧一下我在該文章中提出的想法之一,該想法被較少關(guān)注,即:

Getter和Setter的命名

為什么每次要操作對(duì)象屬性時(shí)都必須使用那些those腫的“ get” /“ is”和“ set”前綴? 此外,屬性的首字母的大小寫也發(fā)生變化。 如果要對(duì)所有用法進(jìn)行區(qū)分大小寫的搜索

屬性,則必須編寫一個(gè)正則表達(dá)式。 我特別難以理解為什么我們應(yīng)該在各處使用吸氣劑。 Getters / setters是提供對(duì)屬性訪問(wèn)的抽象的約定。 即,您通??偸窃趯戇@樣的愚蠢的東西:

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

好。 讓我們接受的是,這似乎是我們作為Java開發(fā)人員的日常生活,編寫了所有這些文章,而不是使用標(biāo)準(zhǔn)的關(guān)鍵字或注釋。 我說(shuō)的是標(biāo)準(zhǔn),而不是Project Lombok等專有的東西。 接受生活事實(shí)后,讓我們看一下java.io.File以獲得更多詳細(xì)信息。 對(duì)我來(lái)說(shuō),這是一個(gè)很好的例子,其中JavaBean-o-mania?完全錯(cuò)誤。 為什么? 查看此源代碼摘錄:

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沒什么不同,盡管將來(lái)的版本將解決此問(wèn)題。

如何改善事情

并非所有的庫(kù)和API都存在這種缺陷。 Java已經(jīng)走了很長(zhǎng)一段路,并且已經(jīng)由許多對(duì)此主題有不同看法的人編寫。 此外,Java極具向后兼容性,因此我認(rèn)為JDK如果是從頭開始編寫的,那么它仍然不會(huì)遭受“ JavaBean-o-mania?”的嚴(yán)重影響。 因此,這里有一對(duì)夫婦的規(guī)則可以遵循在新的API,把事情有點(diǎn)清理:

  • 首先,決定你的API將主要用于彈簧重或JSP / JSF重環(huán)境或任何其他環(huán)境中使用的JavaBeans?的表達(dá)語(yǔ)言,在那里你真的想遵循標(biāo)準(zhǔn)的約定使用。 但是,在這種情況下,請(qǐng)嚴(yán)格遵循約定,并且不要命名任何類似這樣的信息檢索方法:“ File.length()”。 如果您遵循此范式,則所有方法都應(yīng)以動(dòng)詞開頭,絕不能以名詞/形容詞開頭
  • 以上內(nèi)容僅適用于少數(shù)幾個(gè)庫(kù),因此,如果要訪問(wèn)不是屬性的對(duì)象,則可能永遠(yuǎn)不要使用“ get”。 只需使用屬性名稱(名詞,形容詞)。 在呼叫站點(diǎn)上,這看起來(lái)會(huì)更加精簡(jiǎn),尤其是如果您的庫(kù)使用的是Scala之類的語(yǔ)言時(shí)。 這樣,“ File.length()”是一個(gè)不錯(cuò)的選擇,就像“ Enum.values()”一樣,而不是“ File.getLength()”或“ Enum.getValues()”。
  • 如果要訪問(wèn)屬性,則可能也不要使用“ get” /“ set”。 Java可以輕松地將名稱空間用于屬性/方法名稱。 只需在getter / setter中使用屬性名稱本身即可,如下所示: public class MyBean {private int myProperty;public int myProperty() {return myProperty;}public void myProperty(int myProperty) {this.myProperty = myProperty;} }

    不過(guò),請(qǐng)?jiān)俅慰紤]第一個(gè)規(guī)則。 如果要使用Spring配置bean,則別無(wú)選擇。 但是,如果您不需要Spring,則上述內(nèi)容將具有以下優(yōu)點(diǎn):

    • 您的getter,setter和屬性具有完全相同的名稱(以及首字母的大小寫)。 在代碼庫(kù)中進(jìn)行文本搜索要容易得多
    • 該getter看起來(lái)像Scala這樣的語(yǔ)言中的屬性本身一樣,由于使用了語(yǔ)言語(yǔ)法糖:“ myBean.myProperty()”和“ myBean.myProperty”,這些屬性等效于表達(dá)式。
    • Getter和setter在字典順序上緊挨著(例如,在IDE的“大綱”視圖中)。 這是有道理的,因?yàn)樨?cái)產(chǎn)本身比不采取“獲取”和“設(shè)置”行動(dòng)更為有趣。
    • 您無(wú)需擔(dān)心選擇“獲取”還是“是”。 此外,還有一些屬性,無(wú)論如何,“ get” /“ is”無(wú)論如何都是不合適的,例如,只要涉及“ has”->“ getHasChildren()”或“ isHasChildren()”? 嗯,將其命名為“ hasChildren()”! “ setHasChildren(true)”嗎? 不,“ hasChildren(true)”!
    • 您可以遵循簡(jiǎn)單的命名規(guī)則:使用命令式動(dòng)詞來(lái)執(zhí)行動(dòng)作。 使用第三人稱形式的名詞,形容詞或動(dòng)詞訪問(wèn)對(duì)象/屬性。 該規(guī)則已經(jīng)證明標(biāo)準(zhǔn)約定存在缺陷。 “ get”是命令形式,而“ is”是第三人稱形式。
  • 考慮在設(shè)置器中返回“ 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;}}

    下定決心并選擇以上任一選項(xiàng),以確保整個(gè)API保持一致。 在大多數(shù)情況下,方法鏈接沒有實(shí)際結(jié)果值有用。

    無(wú)論如何,將“ void”作為返回類型浪費(fèi)了API范圍。 具體來(lái)說(shuō),考慮Java 8的lambda語(yǔ)法用于帶/不帶返回值的方法(取自Brian Goetz的lambda表示狀態(tài) ):

    // 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上線(對(duì)于那些維護(hù)公共API的人)之后,現(xiàn)在考慮一下這可能是您的API在競(jìng)爭(zhēng)中的決定性優(yōu)勢(shì)。

  • 最后, 一定要使用“獲取”和“設(shè)置”里你真的想強(qiáng)調(diào)語(yǔ)義稱為“漸”和“設(shè)置”的行動(dòng) 。 這包括在以下類型上獲取和設(shè)置對(duì)象:
    • 清單
    • 地圖
    • 參考資料
    • ThreadLocals
    • 期貨
    • 等等…

    在所有這些情況下,“獲取”和“設(shè)置”都是操作,而不是屬性訪問(wèn)。 這就是為什么您應(yīng)該使用諸如“ get”,“ set”,“ put”等動(dòng)詞之類的原因。

  • 摘要

    設(shè)計(jì)API時(shí)要有創(chuàng)造力。 不要嚴(yán)格遵循JavaBeans?和Spring對(duì)整個(gè)行業(yè)施加的無(wú)聊規(guī)則。 訪問(wèn)對(duì)象/屬性時(shí),最新的JDK API以及Google / Apache著名的API很少使用“獲取”和“設(shè)置”。 Java是一種靜態(tài)的類型安全語(yǔ)言。 表達(dá)式語(yǔ)言和注入配置是我們?nèi)粘9ぷ髦械睦狻?因此,我們應(yīng)該針對(duì)我們處理最多的用例優(yōu)化API。 更好的是,如果Spring將他們的思維方式調(diào)整為漂亮,精簡(jiǎn),漂亮和有趣的API,而不是強(qiáng)迫Java世界使用諸如getter和setter之類的無(wú)聊東西來(lái)夸大他們的API!

    參考: Bloated JavaBeans –不要通過(guò)JAVA,SQL和JOOQ博客上的JCG合作伙伴 Lukas Eder 向您的API添加Getter 。

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

    javabeans

    總結(jié)

    以上是生活随笔為你收集整理的javabeans_膨胀的JavaBeans –不要在您的API中添加“ Getters”的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 欧美日韩人妻精品一区在线 | 国产在线精品一区二区三区 | 亚洲不卡视频在线观看 | 欧美一级片在线播放 | 日本午夜精华 | 人人插人人干 | 亚洲第一页色 | 日本电影大尺度免费观看 | 国产熟女高潮一区二区三区 | 一级片特黄 | 日韩视频一区在线观看 | 欧美 日韩 国产 一区 | 国模吧一区二区 | 无码av免费毛片一区二区 | 最好看的mv中文字幕国语电影 | 久久深夜视频 | www污污| 美女网站免费黄 | 992tv在线影院 | 欧美精品免费播放 | 男女视频久久 | 一级久久久久久久 | av软件在线观看 | 亚洲国产成人一区二区 | 国产精品久久久久久av | 欧美日韩国产不卡 | 国产黄色免费网站 | 青青草社区视频 | 亚洲视频网站在线观看 | 亚洲一道本 | 狠狠久久婷婷 | 性xxxx视频播放免费 | 国产av无码专区亚洲av | 91超碰在线观看 | 免费观看理伦片在线播放视频软件 | 亚洲熟女www一区二区三区 | 麻豆视频在线观看免费网站 | 精品国产一区二区三区久久 | 日批视频 | 国产污污视频在线观看 | 久久99精品久久久久久水蜜桃 | 韩国伦理在线视频 | 91调教视频 | 久久一二区 | 日日爽夜夜 | 亚洲婷婷在线视频 | 中文一区二区在线观看 | 视频一区二区三区四区五区 | 色吧综合 | 91新网站 | 欧美日韩黄色一区二区 | 亚洲a精品 | 免费成人深夜夜 | 99视频免费观看 | 香蕉大久久 | 天堂网在线观看 | 99久在线精品99re8热 | 成人毛片在线视频 | 99精品无码一区二区 | 国产福利社 | 欧美经典一区二区三区 | 中国美女一级看片 | 亚洲天堂av免费在线观看 | 性欧美久久 | 亚洲影院中文字幕 | 日韩av在线一区二区三区 | 女仆裸体打屁屁羞羞免费 | 日韩视频在线观看免费 | 天堂最新资源在线 | 黄色三级网站 | 免费毛片一区二区三区久久久 | 国产第一页在线播放 | 五月开心婷婷 | 午夜免费高清视频 | 少妇又紧又爽视频 | 亚洲高清视频在线观看 | 不许穿内裤随时挨c调教h苏绵 | 亚洲一级伦理 | 国产一级一级国产 | 国产成人亚洲精品自产在线 | 久久99国产综合精品免费 | 国产成人自拍视频在线观看 | 国产精品二区三区 | 中文字幕在线亚洲 | 日日碰日日摸 | 国产在线网站 | av一道本 | www.色综合.com| 亚洲29p| 胸网站 | 亚洲黄色影视 | 久久99久久99 | 扒丝袜 | 亚洲AV无码精品国产 | 国产精品偷乱一区二区三区 | 日本在线高清视频 | 九草在线观看 | 一本色道久久88综合日韩精品 | 久久福利视频导航 |