分享
 
 
 

设计迷踪:给JAVA设计开发新手的一些建议和意见(二)

王朝java/jsp·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

飞云小侠 2005-7-23 http://www.jscud.com 转载请注明作者

【处理好你的异常】

-----------------

异常处理是Java编程中非常重要的一个部分.建议在使用异常之前阅读<Effective Java Programming Language Guide>或者<Practical Java>.

下面从书中摘出几条建议:

*绝对不要忽略异常

*千万不要隐藏异常***

*仅在不正常的情况下使用异常

*对可恢复的情况使用可检查异常,对程序错误使用运行时异常(RunTimeException)

*给方法引发的异常做文档

*在详细信息里面包括失败捕获信息

*使用finally避免资源泄漏

*....

在这里特别提出的是,在开发中要特别处理NULL的情况,否则经常引发NullPointException异常,在Java里这是一个最令人头疼的异常了.

如果你的程序因为一个NULL值,而报了几十个NullPointException的话,不但得让人烦死,而且还非常难以找到错误所在.所以在Java中一定要注意这个问题.

如果你的函数不允许Null值,那么可以截获它,抛出一个异常,或者给客户更友好的提示,难道不好吗?

让我们来看一个例子:

public String getName(User aUser)

{

//如果aUser为Null,会发生什么情况

return aUser.getName();

}

很明显,如果参数为Null,就会抛出异常.应该改为:

public String getName(User aUser)

{

if(null=aUser)

{

return "";

}

else

{

return aUser.getName();

}

}

或者你要求参数不能为空,还可以抛出一个异常,强制使用者不能传入空值.

还有经常被忽略的是RunTimeException和普通异常的区别,在Java中,这是一个特殊的异常类,程序中如果遇到这个异常,用户可以不截获它,而如果是其他的普通异常,就不许要截获它.我们的代码经常这么写:

try

{

//your code here

}

catch(Exception e)

{

//do warn

}

这样写的话,就截获了所有异常,当然也包括了RunTimeException. 在很多情况下,这是不合适的处理方式,我们只应截获必要的异常,而应该忽略RuntimeException.

关于RunTimeException,在Spring中还有更好的利用方式,建议阅读Spring框架中在事务中对异常的处理代码,例如对Jdbc抛出的SqlException的转换.

关于异常处理,我提出几点建议:

*捕获异常而且再次抛出时要包含原来的异常信息

*不要忘了RunTimeException,除非必要,否则不要用catch(Exception e)的方式捕获所有异常.

*不要用异常做流程控制,异常的性能代价比较高昂.(对此,可能有人不同意.此处不详细讨论)

*不要把异常处理都抛给别人,本函数有能力处理的就不要抛出.

在此建议读者详细阅读<Effective Java Programming Language Guide>或者<Practical Java>.

【过度依赖】

在定位错误的时候,经常遇到浏览了七 八个文件还是没有找到什么地方执行了真正需要的函数,这个时候就非常郁闷.A调用了B,B调用了C,C调用了D......让人找不到北

面对这样的程序,存在的问题不仅仅是定位错误麻烦,而且如果需要维护这样的函数库/框架,恐怕你的有非常高的统御能力才行,否则打死我也不去维护.

那么我们自己最好不要写这样的程序出来给人用.

【滥用接口】

现在流行"面对接口编程",这本身本来是不错,但是滥用接口的现象却经常发生.

"面向接口",于是所有的类都有一个对应的接口,接口的函数声明和类一模一样,而且一个接口只有一个类来实现它.这样的面向接口有什么意义哪? (为了用Spring的事务的情况除外)

根据"迪比特法则(Law of Demter)",一个对象应当对其他对象有尽可能少的了解.一个接口内应该只定义对方所需要的方法,而不要把一些没用的方法声明放在接口里面.

例如如下一个类:

public class MyCounter

{

private int n1;

private int n2;

public MyCounter(int n1,int n2)

{

this.n1=n1;

this.n2=n2;

}

public void setN1(int n1)

{

return this.n1 = n1;

}

public void setN2(int n2)

{

return this.n2 = n2;

}

public int getN1()

{

return n1;

}

public int getN2()

{

return n2;

}

public int getResult()

{

return n1 + n2;

}

}

我们可以看到,这个类的主要目的是得到计算结果,所以正确的接口应该类似:

public interface Counter

{

int getResult();

}

但是很多情况下,经常是这样的接口:

public interface Counter

{

int getResult();

int getN1();

int getN2();

void setN1(int n1);

void setN2(int n2);

}

我们想一想,这样做有2个后果:

1.除了getResult之外,其他的函数我们根本用不到,所以是多余的.

2.如果我们要自己实现一个Counter,如果接口中仅仅定义了getResult,我们仅仅需要实现它就可以了.我们自己的类可能是多个数运算,有乘除加减等等各种运算,参数也有可能是一些数组.但是如果按照第二种方法声明接口的话,我们就必须实现后面的四个方法,如果这样的话,实现这样东西不仅没用,而且浪费时间.我们恐怕要大声骂娘了吧.

所以,接口有好的作用,但是不要滥用.

■ 如果你的接口永远只有一个类实现,那么可能就没有必要用接口.

■ 你的接口只需要声明别人用到的函数即可.

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有