欢迎来到天天文库
浏览记录
ID:30768611
大小:90.50 KB
页数:9页
时间:2019-01-03
《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)。规则
此文档下载收益归作者所有