Re: [J2SE] enum應用問題
問題不是在於其他程式能不能用 其他程式當然是可以使用ENUM
我想看看大家有沒有比較好的設計想法建議我
-----------------------------------------
舉個例子
Web系統的修改使用者狀態
使用者狀態有兩種值 open/close
原本設計提供這種方法 updateStatus(String id,String Status)
前端可能是一個表單 有下拉選單或Radio Box
所以傳入後端是
String id
String status //value is open/close
****第一種寫法***********
程式可能會呼叫
updateStatus(id,status);
但是如果要處理當status值不在預期內的情況 那就需要做檢查
但是用一般判斷式檢查String 以後status要增加或更改 那要加寫程式
所以我想到改利用Enum做檢查 以後維護修改都很方便
****第二種寫法***********
但是如果提供的方法改成
updateStatus(String id,Status status)
那就可能會呼叫
updateStatus(id,Status.valueOf(status));
但這樣有可能會拋出例外 如果該頁PG撰寫者沒有處理 那系統就會停在這
他當然是可以直接使用enum
但是他必須還加寫判斷傳入的status值 他才知道要傳入哪個ENUM 不是嗎?
可能變成這樣
if(status.equals(Status.open)){
updateStatus(id.Status.open);
}else if(status.equals(Status.close)){
updateStatus(id,Status.close);
}else if(...){
....
...
以後要加status 就要加寫判斷
狀態越多 程式會越來越長
而且這些是散落在各處呼叫這之程式的地方
可能就會有N份 相同的程式
只是為了判斷要傳入哪個ENUM值
※ 引述《KevinGet (就算我換了ID)》之銘言:
: 在寫一些Util的時候 在想到底是用enum好還是不要好
: 一般Util傳入參數 值可能是限定某些值
: 一種做法是宣告一些final static String .....
: 但是可能問題是 使用Util的人 不傳你這宣告好的參數 他傳自訂String "xxxx"
: 所以你有可能會收到例外的值
: 另一種做法用enum
: 但是我覺得enum也有問題
: 如果使用者參數傳遞 ENUM.valueOf("xxx")
: 一樣會有例外值 並且會拋出Exception
: 變成使用Util的人必須自己處理Exception
: 第三種變通的做法
: 就是仍然宣告ENUM 但是參數宣告仍為基本型態
: 但是ENUM用在Util裡面檢查用
: 我想了想 是哪種設計方法好呢?
: 以下附上範例討論的Util
: 和可能情況code
: 可能呼叫情況:
: public static void main(String a[]) {
: String url = "http://www.asiafm.com.tw/";
: //call changeProtocol(String url, String prot)
: System.out.println( URLUtil.changeProtocol(url,"http") );
: System.out.println( URLUtil.changeProtocol(url,PROTOCOL.http.toString()) );
: System.out.println( URLUtil.changeProtocol(url,"httpxx") );//參數值不在遇期內
: //call changeProtocol(String url, PROTOCOL prot)
: System.out.println( URLUtil.changeProtocol(url,PROTOCOL.http) );
: System.out.println( URLUtil.changeProtocol(url,PROTOCOL.valueOf("httpxx")) );
: //參數值不在遇期內 , 會有IllegalArgumentException
: //參數值不在遇期內 ,必須自己處理IllegalArgumentException
: try{
: System.out.println( URLUtil.changeProtocol(url,PROTOCOL.valueOf("httpxx")) );
: }catch(IllegalArgumentException e){}
: 範例Util:
: enum PROTOCOL {http,https,ftp,ftps}
: public class URLUtil {
: /*
: * ex1:
: * String url = "http://www.asiafm.com.tw/";
: * URLUtil.changeProtocol(url,"http")
: */
: public static String changeProtocol(String url, String prot) {
: //valid url
: if (ValueUtil.isStringEmpty(url)) {
: return "";
: }
: //valid protocol
: try{
: PROTOCOL.valueOf(prot);
: }catch(IllegalArgumentException e){
: return url;
: }
: return prot + url.substring(url.indexOf("://"), url.length());
: }
: public static String changeProtocol(String url, PROTOCOL prot) {
: //valid url
: if (ValueUtil.isStringEmpty(url)) {
: return "";
: }
: return prot + url.substring(url.indexOf("://"), url.length());
: }
: }
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 60.250.192.34
※ 編輯: KevinGet 來自: 60.250.192.34 (03/04 11:00)
討論串 (同標題文章)