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 ]
[
下一页 ]