作者KevinGet (就算我换了ID)
看板java
标题Re: [J2SE] enum应用问题
时间Fri Mar 4 11:00:05 2011
问题不是在於其他程式能不能用 其他程式当然是可以使用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)