java编程细节之十个最佳实践-java开发java经验技巧

java编程细节之十个最佳实践-java开发java经验技巧

ID:30768611

大小:90.50 KB

页数:9页

时间:2019-01-03

java编程细节之十个最佳实践-java开发java经验技巧_第1页
java编程细节之十个最佳实践-java开发java经验技巧_第2页
java编程细节之十个最佳实践-java开发java经验技巧_第3页
java编程细节之十个最佳实践-java开发java经验技巧_第4页
java编程细节之十个最佳实践-java开发java经验技巧_第5页
资源描述:

《java编程细节之十个最佳实践-java开发java经验技巧》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、Java编程细节ZI•个最佳实践-编程开发技术Java编程细节之十个最佳实践木文由ImportNew・汤米猫翻译自dzoneo欢迎加入翻译小组。转载请见文末要求。本文讲述的十个最佳实践,这十个最佳实践要比通常JoshBlochEffectiveJava规范更加细致。JoshBloch的清单很容易学习,考虑的多是口常的情形,而木文则包括了不常见的情形例如API或SP1设计,尽管不常见,他们却可能冇着大的影响。译注:JavaSPT(ServiceProviderInterface)是针对厂商或者插件提供的接口,提供类似“Callback”的功能,实现对API

2、的定制。关于SPI的详细信息可以参见java.util.ScTviccLoadcr文档。我在开发和维护JOOQ的过程中遇见过这类事情,JOOQ是一个用Java模拟SQL的internalDSL(DomainSpecificLanguage)・作为一个internalDSL,JOOQ挑战了Java编译器和泛型的极限,它结合泛型,可变参数和重载的方式恐怕是JoshBloch在"averageAPI”中不做推荐的。让我来告诉你这10个Java编程细节的最佳实践。1、记住OH■的析构函数要记住C++的析构函数(C++destructors)?不想这样做?那你得很

3、幸运以至于从来不需要调试那些由于分配内存而没有在对象移除后释放内存而导致内存泄踞的代码。感谢Sun/Oracle实现了垃圾回收机制。不过尽管如此,析构函数有一个有趣的特征。通常按照分配的逆序来释放内存是冇道理的。在Java中也记着这一点,在你操作类似于析构函数的语义时•JUnit注释中使川@Before和@人仕贾时•在分配和释放JDBC资源时•在调用父类方法吋有多种实例。下面是一个貝体的例了,它展示了如何实现事件监听器SPI:©OverridepublicvoidbeforeEvent(EventContexte){super.beforeEvent(e

4、);//Supercodebeforemycode©OverridepublicvoidafterEvent(EventContexte){//Supercodeaftermycodesuper.afterEvent(e);}另一个好的例子展示了为什么它对于臭名昭著的哲学家就餐问题I•分重要。更多关于哲学家就餐问题请参看这篇好文:http://adit.io/posts/2013-05Tl-The-Dining-Philosophers-Problem-With-Ron-Swanson.html规则:在任何你要使用before/after,allocat

5、e/free,take/return这样的语义來实现逻辑时,想一想after/free/return操作是否应该以逆序的方式执彳亍里而的内容。2、不要信任你早期SPI演化的结论给客户提供SPT是一个简单的方式讣他们在库或者代码中注入自定义的行为。但是请注意,你的SPI演化结论可能会欺骗你,让你觉得你可能(不再)需要那个参数。是的,任何功能都不应过早的加入。但是一旦你发布了你的SPI并且你决定遵循语义的版本控制,你就会后悔自己在SP1屮加了一个愚奩的,只有一个参数的方法,你意识到在某些情况下你还需要另一个参数:interfaceEventListener{

6、//Badvoidmessage(Stringmessage);}这里如果你还需要一个messageID和一个messagesource怎么办?API演化可以阻止你轻易的给上面这个类添加参数。诚然,在javaSH1,你可以添加一个defender方法,来'defend'你早期的坏的设计决定。interfaceEvcntListcncr{//BaddefauItvoidmessage(Stringmessage){message(message,null,null);}//Better?voidmessage(Stringmessage,Integerid

7、,MessageSourcesource);请注意,不幸的是defender方法不能定义为finale不过这跟用一堆方法污染你的api相比,已经很不错了,在这里可以使用一个上下文对彖或者参数对彖:inierfaceMessageConlext{Stringmessage();Integerid();MessageSourcesource();}interfaceEventListener{//Awesome!voidmessage(MessageContextcontext);}相对于EventListenerSPI而言,你口J以更容易地扩展Messag

8、eContextAPT,彳艮少有人会实现它(指EventListener)。规则

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。