常量和枚舉:面試和工作必看
1.魔法值和硬編碼
在代碼編寫的場景中,會遇到提示避免去使用 魔法值(magic numbers)和硬編碼(hardcoding)。
- 魔法值就是在代碼中直接使用的,沒有提供任何注釋或解釋說明其用途和含義的常數(shù)值。
- 硬編碼指的是在程序中直接使用特定的值或信息,而不是通過變量、常量或其他可配置的方式來表示。這些值通常是字面量字符串、數(shù)字或其他原始數(shù)據(jù)類型,在代碼中寫死了,無法修改。
缺點:
不便于維護:如果需要修改值,必須手動在代碼中查找并替換,會增加代碼修改的復(fù)雜度和風(fēng)險。
可讀性差:硬編碼的值缺乏描述和注釋,不易于理解和解釋。在工作中,協(xié)作開發(fā),其他開發(fā)人員在閱讀代碼時可能無法理解這些值的含義和作用。
維護困難:當(dāng)需要修改值的時候,需要在代碼中找到所有使用該值的地方進行手動修改。這樣容易出錯,而且增加了代碼維護的復(fù)雜性。
2.定義常量
場景:設(shè)π取小數(shù)點后五位數(shù)(即3.14159)計算圓的面積
Java常量定義是指在Java程序中定義一個不可修改的值,Java常量的定義使用關(guān)鍵字final,一般與static關(guān)鍵字一起使用。
此時可以通過定義一個常量作為π
public class MyClass { //圓周率π public static final double PI = 3.14159; }
上面這個定義在類中的常量稱為 類常量,可以通過類名訪問。
通過定義常量,就避免在代碼中直接使用沒有明確含義的硬編碼數(shù)字。取而代之,將這些數(shù)字賦值給具有描述性名稱的常量。
3.if - else if - else if - else if.....else
在項目中看過這面這段代碼,通過判斷天氣給出建議
public void handleWeather(String weather) { if (weather.equals("晴天")) { System.out.println("做好防曬"); } else if (weather.equals("陰天")) { System.out.println("戶外活動"); } else if (weather.equals("小雨")) { System.out.println("帶雨傘"); } else if (weather.equals("雷雨")) { System.out.println("避免戶外活動"); } else { System.out.println("未知天氣"); } }
這段代碼的判斷條件 "晴天"、"陰天"、"小雨"等,這些條件在項目不止使用到了一次,比如在另外一個方法中也有一個判斷,但是判斷執(zhí)行的方法體不同,如下
public void handleWeather(String weather) { if (weather.equals("晴天")) { System.out.println("出太陽"); } else if (weather.equals("陰天")) { System.out.println("有烏云"); } .... }
現(xiàn)在如果需要 把 晴天 這個天氣情況修改為 高溫天,那么就需要修改兩處地方,在實際項目中可能更多。
所以這里必須要定義枚舉提高代碼的可維護性
4.定義枚舉
定義枚舉類如下
public enum WeatherType { SUNNY("晴天"), CLOUDY("陰天"), LIGHT_RAIN("小雨"), THUNDERSTORM("雷雨"), UNKNOWN("未知天氣"); private final String message; WeatherType(String message) { this.message = message; } public String getMessage() { return message; } }
將代碼用枚舉結(jié)合switch case來替換
public void handleWeather(String weather) { WeatherType weatherType = WeatherType.valueOf(weather); switch (weatherType) { case SUNNY: System.out.println("做好防曬"); break; case CLOUDY: System.out.println("戶外活動"); break; case LIGHT_RAIN: System.out.println("帶雨傘"); break; case THUNDERSTORM: System.out.println("避免戶外活動"); break; case UNKNOWN: System.out.println("未知天氣"); break; } }
5.結(jié)語
在日常工作中,會有很多狀態(tài)類型的字段,比如淘寶訂單,狀態(tài)可以為:待付款、待發(fā)貨、已發(fā)貨、已簽收、交易成功等,真實場景狀態(tài)可能更多。
而狀態(tài)也會被很多代碼給使用到,所以必須通過集中統(tǒng)一的方式來定義。
通過常量、枚舉,可以很好的解決問題,一旦狀態(tài)有新增、修改、刪除都只需要修改一處地方,其它代碼直接引用就行。
#面經(jīng)##我的求職思考#