


全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
作者从多年的经验中吸取到,有六个Java SE功能/API是不提倡Java程序员使用的,它们分别是Reflection、Bytecode manipulation、ThreadLocals、Classloaders、Weak/Soft references、Sockets。本文作者是一名拥有多年Java开发经验的程序员,他从经验中得出,并不是所有的Java SE功能/API都值得程序员去使用,比如本文列举的这6个,大家在使用前得慎重对待。以下是对原文的摘译。多年的Java开发经验告诉我,从长远角度来看,以下这些Java SE功能/API,开发者最好停止使用。 Reflection Bytecode manipulation ThreadLocals Classloaders Weak/Soft references Sockets1.ReflectionReflection即反射,在许多流行的库里面都有反射机制,比如Spring和Hibernate。通过对业务代码进行反思,我建议大家避免使用反射。下面列出我反对使用的原因:首先涉及到代码可读性/工具支持。打开IDE并且在Java代码里找到相互依赖关系。使用relection替换方法调用,并且试着重复该步骤。事情变的愈发不可收拾,正常情况下都应该封装好了再修改状态。下面来看看具体代码示例:1234567891011121314151617publicclassSecret privateString secrecy;publicSecret(String secrecy) this.secrecy = secrecy;publicString getSecrecy() returnnull;publicclassTestSecrecy publicstaticvoidmain(String args)throwsException Secret s =newSecret(TOP SECRET);Field f = Secret.class.getDeclaredField(secrecy);f.setAccessible(true);System.out.println(f.get(s);通过查看以上代码可以得知,方法getDeclaredField()参数只有在运行时才可以被发现。而你也清楚,运行时产生的bug总比不执行脚本要更加棘手。其次,反射调用优化是由JIT执行的,一些优化可能需要花费很长时间才能得到应用,而有些优化甚至都得不到应用,所以关于反射的性能优化有时会被数量化。但在一个典型的业务应用程序中你可能不会真正意识到这些性能开销。总之,开发者应该通过AOP合理地在业务层使用反射,除此以外,你最好离它远远的。2.Bytecode manipulation.字节码操作,如果我看到你在Java EE应用程序里直接使用CGLIB或ASM,我可能会立即跑开。最糟糕的事情莫过于在编译期间没有任何可执行的代码。实际上,当产品在运行时,你根本不知道哪块代码在运行。所以,当你遇到麻烦时,会自然地把错误抛给运行时故障排除和调试,不过这样反而会更麻烦。3.ThreadLocals这里有两个不相关的原因,当我在业务层代码里看到ThreadLocals时会颤抖。首先,在ThreadLocals的帮助里,你可能会看到许多变量的使用都没有通过方法调用链来明确地向下传递。这在某些场合下是有用的,但当你一旦粗心,你会在代码里构建许多意料不到的依赖关系。第二个不相关的原因与我日常的工作相关,在ThreadLocals里存储数据会引发内存泄露。最起码我遇到的Permgen泄露有十分之一都是使用ThreadLocals造成的,在结合了类加载器和线程池后,“java.lang.OutOfMemoryError:Permgen space”异常可能就马上出现了。4.Classloaders首先,类加载器是一个复杂的野兽。你必须先了解它的层次结构、委托机制、类缓存等等。即使你认为自己已经掌握了,它可能还是不能正常工作。最终将导致一个类加载器泄露问题。因此我只能建议你将这个任务留给应用服务器处理5.Weak/Soft references现在,你应该更好的理解Java的内部方法。使用软引用来重写所有的缓存并不明智。我知道,当你手上拿着锤子的时候,就会到处寻找钉子。可对于锤子来说,缓存并不是个好钉子。为什么?基于软引用构建缓存可能是如何委托一些复杂因素到GC而不是通过自身实现的一个好例子。下面举个缓存的例子,你使用软引用来创建数据,当内存被耗尽时,GC进入并且进行清理。但是,缓存中被删除的对象并未得到你的控制,而且很有可能在下一次的cache-miss中重新创建。如果内存仍然不足,你可以触发GC进行再次清理。你可能已经看出了整个运行过程的恶性循环,整个应用程序就变成了CPU与GC不断运行的状态了6.Sockets普通老式的.Socket实在是太复杂,以至于很难弄正确。我觉得阻塞性是其根本性的缺陷。当你编写一个典型的带有Web前端的Java EE应用程序时,应用程序需
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《一、奔跑的鸵鸟》(教学设计)-2024-2025学年二年级上册综合实践活动山东科学技术版
- 2023七年级数学上册 第一章 有理数1.3 有理数的加减法1.3.2 有理数的减法第1课时 有理数的减法教学设计(新版)新人教版
- 胸引管护理操作流程
- 2024新教材高中历史 第五单元 工业革命与马克思主义的诞生 第10课 影响世界的工业革命教学设计 部编版必修中外历史纲要下
- 4山行教学设计-2024-2025学年三年级上册语文统编版
- 《学画写意花卉-梅花》教学设计-鲁教版五四制七年级美术上册
- 1 春夏秋冬(教学设计)-2024-2025学年统编版(2024)语文一年级下册
- 7 角的初步认识第二课时(教学设计)-2023-2024学年二年级下册数学苏教版
- 一年级道德与法治上册 第四单元 银色的冬天 14《庆元旦迎春节》教学设计设计2 鄂教版
- Module4 Unit2 What's the matter with Daming(教学设计)-2024-2025学年外研版(三起)英语五年级上册
- 2022-2023学年新疆维吾尔自治区喀什地区喀什市人教版六年级下册期中测试数学试卷
- 旅游景区运营委托经营协议书
- 江苏省苏州市张家港市2023-2024学年高一年级下册4月期中生物试题(解析版)
- 中医医疗技术手册2013普及版
- 第18课《在长江源头各拉丹东》课件+2023-2024学年统编版语文八年级下册
- 公厕保洁服务保洁实施方案
- MOOC 空中机器人-浙江大学 中国大学慕课答案
- 《纸质文物修复与保护》课件-29古籍的装帧形制
- 2024-2029年中国ICT行业市场发展分析及发展趋势与投资前景研究报告
- TPM培训资料-课件
- 职业健康知识培训考试题及答案
评论
0/150
提交评论