作者KevinGet (就算我换了ID)
看板java
标题[J2SE] enum应用问题
时间Thu Mar 3 15:50:56 2011
在写一些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
1F:→ KevinGet:我的希望是 一个Util的设计应该是 能处理例外状况 03/03 15:55
2F:→ tkcn:为什麽要用 valueOf 而不是直接 PROTOCOL.http ? 03/03 17:05
3F:→ KevinGet:MVC架构前端传进来的是String 这段有可能是其他PG撰写 03/03 17:52
4F:推 slalala:理论上 其他PG应该也可使用 PROTOCOL.http 才是 03/04 02:14
5F:→ adrianshum:你的lib提供concrete interf 比去想MVC怎样传重要多了. 03/04 10:50
6F:→ sbrhsieh:你没有办法阻止程式员拿石头砸自己的脚。 03/04 20:33