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

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

生活随笔

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

java

2个菜鸟Java常量和枚举陷阱

發(fā)布時(shí)間:2023/12/3 java 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 2个菜鸟Java常量和枚举陷阱 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在對(duì)Java和Groovy代碼進(jìn)行的各種代碼審查中,我經(jīng)常看到魔術(shù)數(shù)字和其他隨機(jī)字符串在整個(gè)代碼庫(kù)中亂七八糟。

例如,魔術(shù)數(shù)字是下面的代碼(Groovy)中的4.2:

if (swashbuckle >= 4.2) {... }

4.2是什么意思?

我的建議是將一個(gè)數(shù)字提取為一個(gè)常數(shù),并為其賦予一個(gè)有意義的意圖顯示名稱,以便我們所有人都可以繼續(xù)理解我們的代碼。

重構(gòu)成

if (swashbuckle >= MAX_ALLOWED_CAPACITY) {... }

即使是初學(xué)者,也可以理解The Constant的值,并開始將各地的值提取為常量。 當(dāng)我談?wù)?strong>枚舉時(shí),編寫可讀代碼甚至更有可能,但是經(jīng)驗(yàn)不足的開發(fā)人員很快就會(huì)陷入以下陷阱。

陷阱#1全球über-Constants文件

應(yīng)盡可能避免使用全局常量文件,例如

class Constants {private static final String PEACH_FLAME = "PFL"private static final int MAX_TOOGIT = 17private static final int MIN_TOOGIT = 8private static final String USER_NAME_AGE_PROPERTY = "age"private static final String USER_NAME_FLOPPY_PROPERTY = "floppy"private static final int CUSTOM_HYSLERIA_DONE = -99private static final List<String> WOBBA_RANGE = ['BZ, 'FLL', 'BZZ']// dozens of other constants...

引用StackOverflow總結(jié)得很好 :

我強(qiáng)烈建議不要使用單個(gè)常量類。 當(dāng)時(shí)這似乎是個(gè)好主意,但是當(dāng)開發(fā)人員拒絕記錄常量并且該類增長(zhǎng)到包含多達(dá)500個(gè)完全不相關(guān)的常量(與應(yīng)用程序的完全不同的方面)時(shí),這通常會(huì)變成完全不可讀的常量文件。 代替:

  • 如果可以訪問(wèn)Java 5+,請(qǐng)使用枚舉為應(yīng)用程序區(qū)域定義特定的常量。 對(duì)于這些常量,應(yīng)用程序區(qū)域的所有部分都應(yīng)引用枚舉,而不是常量。 您可以聲明類似于聲明類的枚舉。 枚舉也許是Java 5+的最(也是唯一的)有用的功能。
  • 如果您的常量?jī)H對(duì)特定類或其子類之一有效,則將其聲明為protected或public,然后將其放在層次結(jié)構(gòu)中的頂級(jí)類上。 這樣,子類可以訪問(wèn)這些常量值(如果其他類通過(guò)public訪問(wèn)它們,則這些常量不僅僅對(duì)特定的類有效……這意味著使用該常量的外部類可能與包含該常量的類緊密耦合。常數(shù))
  • 如果您有一個(gè)定義了行為的接口,但是返回值或參數(shù)值應(yīng)該是特定的,那么在該接口上定義常量是完全可以接受的,以便其他實(shí)現(xiàn)者可以訪問(wèn)它們。 但是,請(qǐng)避免創(chuàng)建僅用于保存常量的接口:它可能與僅為保存常量而創(chuàng)建的類一樣糟糕。

一個(gè)類(例如上面的Constants示例)很快就變成了一切 。 新秀開發(fā)人員認(rèn)為他通過(guò)將魔術(shù)數(shù)字和魔術(shù)字符串提取為常量來(lái)遵循良好的(代碼審查)建議,但是團(tuán)隊(duì)很快就承擔(dān)了新的維護(hù)負(fù)擔(dān)。

如果你發(fā)現(xiàn)自己(或你的團(tuán)隊(duì))這樣做,請(qǐng)把負(fù)責(zé)任的車主如用戶相關(guān)的常數(shù)常量在UserService在和wobba相關(guān)常量WobbaConverter -不管它是什么

還請(qǐng)閱讀上面評(píng)論中有關(guān)枚舉的部分,因?yàn)槌A坎⒉皇擎?zhèn)上唯一的孩子。 有時(shí)我的建議是……

首選枚舉

如果您的常量可以很好地建模為枚舉,請(qǐng)考慮枚舉結(jié)構(gòu)。 枚舉比普通常量更通用 ; 它們是類,可以包含屬性和方法。

在負(fù)責(zé)任的父類中。

更喜歡

class Person {enum Gender { M, F }String nameGender gender }

過(guò)度

class Person {static final String GENDER_MALE = 'M'static final String GENDER_FEMALE = 'F'String nameString gender }

或作為使用它的班級(jí)附近的一個(gè)單獨(dú)的班級(jí) (如果它變大了)。 帶有功能名稱的enum類的一個(gè)很好的例子是例如一些相關(guān)的(技術(shù))數(shù)據(jù)

/*** Represents medicine domain codes.*/ public enum MedicineCode {/** Diagnosis e.g. "Muscle damage". */DIAGNOSIS("X357"),/** Units in medicinal context e.g. "cc/ml". */MEDICINE_UNIT("X523"),/*** Cause codes for diagnosis = 'Masitis' e.g. "E.coli (ECO)".*/CAUSE_CODE("X536"),/** TreatmentType e.g. "Antibiotics". */INTERVAL_TYPE("X520"), MedicineCode(String code) {this.code = code;}private final String code;public String code() {return code;}/*** Find a {@link MedicineCode} by given String code.** @param code The code e.g. "X261"* @return found medicine code, or null*/public static MedicineCode findByCode(String code) {values().find { it.code() == code }}@Overridepublic String toString() {return name() + "(" + code() + ")"} }

每當(dāng)需要表示一組固定的常量時(shí),都應(yīng)使用枚舉類型。 因此,新秀開發(fā)人員認(rèn)為他通過(guò)遵循一些很好的(代碼審查)建議,將內(nèi)容提取到枚舉中,封裝了技術(shù)數(shù)據(jù),使用功能名稱等,但通常會(huì)陷入

陷阱#2定義枚舉,并非真正正確地使用它們

因此,如果您最初具有以下方法和調(diào)用:

Medicine findMedicineForDomainCode(String code)// which you call like: String intervalTypeCode = "X520" findMedicineForDomainCode(intervalTypeCode)

并且您可能會(huì)引入像MedicineCode這樣的枚舉(請(qǐng)參見上文),將所有這些特定于域的技術(shù)代碼(例如數(shù)據(jù)庫(kù)“ X…”)(例如“ X520”)封裝在一起,然后不要這樣做:

Medicine findMedicineForDomainCode(String domainCode)// which one keeps calling like: String intervalTypeCode = MedicineCode.findByCode("X520") findMedicineForDomainCode(intervalTypeCode)

我見過(guò)像這樣的團(tuán)隊(duì)。 是的,有一個(gè)帶有值的枚舉類型,但是團(tuán)隊(duì)在整個(gè)代碼中并不十分了解如何處理它們。

第一步是直接引用枚舉 。 某些菜鳥開發(fā)人員通常最初已經(jīng)理解了這一點(diǎn),這取決于他們是否遵循Oracle Java Enum Types教程或類似內(nèi)容,但是通常會(huì)導(dǎo)致如下所示:

Medicine findMedicineForDomainCode(String code)// which one calls like: String intervalTypeCode = INTERVAL_TYPE.code() // WRONG! still using Strings here findMedicineForDomainCode(intervalTypeCode)

有了枚舉意味著我們現(xiàn)在可以鍵入所有內(nèi)容,包括返回類型和方法參數(shù)

只是將枚舉用作容納字符串的容器并不是我們這樣做的原因:為了獲得更好的類型安全性和可讀性,您應(yīng)該重構(gòu)代碼中的所有內(nèi)容,以便將域代碼用作MedicineCode枚舉的字符串類。

更好:

// first refactor method parameter from String to MedicineCode Medicine findMedicineForDomainCode(MedicineCode code)// now just pass an enum value findMedicineForDomainCode(INTERVAL_TYPE)

然后,直到那時(shí),在最后一個(gè)可能的時(shí)刻,您需要實(shí)際的封裝String代碼(“ X520”)–可以從枚舉值中提取出它。

希望這有助于定義常量和使用枚舉。 對(duì)于適當(dāng)設(shè)計(jì)的枚舉類型,我無(wú)法涵蓋所有??其他可能的“有效”用法和OO優(yōu)勢(shì)場(chǎng)景,但是希望本文能夠防止Java新手陷入所描述的陷阱。

翻譯自: https://www.javacodegeeks.com/2016/04/2-rookie-java-constants-enums-pitfalls.html

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的2个菜鸟Java常量和枚举陷阱的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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