打字猴:1.700449327e+09
1700449327 编写高质量代码:改善Java程序的151个建议 [:1700438190]
1700449328 编写高质量代码:改善Java程序的151个建议 建议116:异常只为异常服务
1700449329
1700449330 异常只为异常服务,这是何解?难道异常还能为其他服务不成?确实能,异常原本是正常逻辑的一个补充,但是有时候会被当作主逻辑使用,看如下代码:
1700449331
1700449332 //判断一个枚举是否包含String枚举项
1700449333
1700449334 public static<T extends Enum<T>>boolean Contain(Class<T>c, String name){
1700449335
1700449336 boolean result=false;
1700449337
1700449338 try{
1700449339
1700449340 Enum.valueOf(c, name);
1700449341
1700449342 result=true;
1700449343
1700449344 }catch(RuntimeException e){
1700449345
1700449346 //只要是抛出异常,则认为是不包含
1700449347
1700449348 }
1700449349
1700449350 return result;
1700449351
1700449352 }
1700449353
1700449354 判断一个枚举是否包含指定的枚举项,这里会根据valueOf方法是否抛出异常来进行判断,如果抛出异常(一般是IllegalArgumentException异常),则认为是不包含,若不抛出异常则可以认为包含该枚举项,看上去这段代码很正常,但是其中却有三个错误:
1700449355
1700449356 异常判断降低了系统性能。
1700449357
1700449358 降低了代码的可读性,只有详细了解valueOf方法的人才能读懂这样的代码,因为valueOf抛出的是一个非受检异常。
1700449359
1700449360 隐藏了运行期可能产生的错误,catch到异常,但没有做任何处理。
1700449361
1700449362 我们这段代码是用一段异常实现了一个正常的业务逻辑,这导致代码产生了坏味道。要解决此问题也很容易,即不在主逻辑中使用异常,代码如下:
1700449363
1700449364 //判断一个枚举是否包含String枚举项
1700449365
1700449366 public static<T extends Enum<T>>boolean Contain(Class<T>c, String name){
1700449367
1700449368 //遍历枚举项
1700449369
1700449370 for(T t:c.getEnumConstants()){
1700449371
1700449372 //枚举项名称是否相等
1700449373
1700449374 if(t.name().equals(name)){
1700449375
1700449376 return true;
[ 上一页 ]  [ :1.700449327e+09 ]  [ 下一页 ]