开发者应该避免使用的6个Java功能(转)

本文作者是一名拥有多年Java开发经验的程序员,他从经验中得出,并不是所有的Java SE功能/API都值得程序员去使用,比如本文列举的这6个,大家在使用前得慎重对待。以下是对原文的摘译。

多年的Java开发经验告诉我,从长远角度来看,以下这些Java SE功能/API,开发者最好停止使用。 

  • Reflection
  • Bytecode manipulation 
  • ThreadLocals
  • Classloaders
  • Weak/Soft references
  • Sockets 

1.Reflection

Reflection即反射,在许多流行的库里面都有反射机制,比如Spring和Hibernate。通过对业务代码进行反思,我建议大家避免使用反射。下面列出我反对使用的原因:

首先涉及到代码可读性/工具支持。打开IDE并且在Java代码里找到相互依赖关系。使用relection替换方法调用,并且试着重复该步骤。事情变的愈发不可收拾,正常情况下都应该封装好了再修改状态。下面来看看具体代码示例:

public class Secret {
    private String secrecy;
    public Secret(String secrecy) {
        this.secrecy = secrecy;
    }
    public String getSecrecy() {
        return null;
    }
}
public class TestSecrecy {
    public static void main(String[] args) throws Exception {
        Secret s = new Secret("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应用程序里直接使用CGLIBASM,我可能会立即跑开。

最糟糕的事情莫过于在编译期间没有任何可执行的代码。实际上,当产品在运行时,你根本不知道哪块代码在运行。所以,当你遇到麻烦时,会自然地把错误抛给运行时故障排除和调试,不过这样反而会更麻烦。

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 

普通老式的java.net.Socket实在是太复杂,以至于很难弄正确。我觉得阻塞性是其根本性的缺陷。当你编写一个典型的带有Web前端的Java EE应用程序时,应用程序需要高并发度来支持大量的用户,而你现在最不想发生的是不具有可扩展的线程池坐等阻塞套接字。

目前有许多精彩可用的第三方库,使用它们可以更好的完成任务,比如Netty,开发者不妨尝试下。

http://www.iteye.com/news/28388

 http://www.infoq.com/cn/news/2013/11/six-java-features-to-avoid

 

时间: 2024-12-22 00:32:29

开发者应该避免使用的6个Java功能(转)的相关文章

移动开发者最爱编程语言 TOP 5,JAVA 居首

在选择支持平台方面,移动开发者中首选Android/iOS作为开放平台的超过8成.而有志于从事AR/VR的开发者比例也有所上升,据调查有48%的开发者有兴趣从事于AR/VR相关的开发. https://yqfile.alicdn.com/1464ef0dd417077c11413ef0ff8a487f0a5afc4b.png" > 在开发者支持平台方面,Apple和Google是开发者支持平台的领导者.职业移动开发者中有41%以Android为目标,39%以iOS为首选平台. 而在近期GD

求助添加java功能。。。。。。。。。。。。。。。。。。。

问题描述 求助添加java功能................... 改下背景,添加胜负判断与重新开始功能 解决方案 步骤:首先在project里新建个文件夹(Folder),然后把你要插入的图片复制黏贴到这个文件夹里面. 解决方案二: 你这是自问自答么,我完全看不懂,你问的啥意思啊 解决方案三: 难倒是要倒分的节奏??? 解决方案四: 那个不是我好吧,,,这个没法上源程序.http://pan.baidu.com/disk/home,这是源程序,怎么添加背景和悔棋

论:开发者信仰之“天下IT是一家“(Java .NET篇)

比尔盖茨公认的IT界领军人物,打造了辉煌一时的PC时代. 2008年,史蒂夫鲍尔默接替了盖茨的工作,成为微软公司的总裁. 2013年他与微软做了最后的道别. 2013年以后,我才真正看到了微软的变化.尤其是它的"云优先,移动优先"的战略,这才是符合新时代潮流的大势. 今天,既然我们重点是来讨论Java与.NET领域的,那关于微软的是是非非且放置脑后.我说.NET看起来更新很快,目前只是在弥补曾经犯下的错.      那.NET之前究竟错在哪里..NET既然是微软实现跨平台与Java竞争

Facebook敦促开发者尽量不要产品中加入自动发布功能

摘要: 你的好友小梅在Instagram 上赞了一张照片,或者 诶,张哥,你昨在Vimeo 上赞的是啥视频啊? 相信很多Facebook 用户都因为Facebook 自动发布状态而有过尴尬.厌恶的经历.你们可以解脱了. "你的好友小梅在Instagram 上赞了一张照片",或者 "诶,张哥,你昨在Vimeo 上赞的是啥视频啊?" 相信很多Facebook 用户都因为Facebook 自动发布状态而有过尴尬.厌恶的经历.你们可以解脱了. 上周,Facebook 针对I

小编给各位小伙伴分享一款OSS费用统计工具

小编在使用阿里云OSS的过程中,发现不能够满足统计指定AK产生的费用需求,于是只能通过IP统计,但是由于阿里云并非开放相关接口,所以Alibaba-OSS-Statistic 这款统计工具由此诞生,在这里开源出来和各位小伙伴分享,工具较为简单,开箱即用. Alibaba-OSS-Statistic Alibaba-OSS-Statistic 是一款用于统计阿里云OSS使用费用的工具 软件说明 软件名称:阿里巴巴OSS统计工具 版本号:1.0.0 开发者:www.openstring.cc 语言:

Java开发者必备:PaaS解决方案盘点

PaaS(Platform-as-a-Service)是云服务的一种,服务提供商不仅提供按需索取的硬件和操作系统服务,还提供了应用程序平台和解决方案栈.对开发者而言,PaaS极大程度上减少了IT部署的开销和痛苦,按需为应用程序提供资源,让其更易伸缩. JVM.应用服务器和部署包(例如,WAR和EAR)为Java应用程序提供了天然的隔离,允许不同开发者在同一套基础设施中部署应用程序,因此Java平台十分适合PaaS.但是,过去几年里,大多数PaaS产品都围绕着Ruby和Python这样的平台,当时

PHP与已存在的Java应用程序集成

程序 PHP功能的另外一个优势是其调用已有Java对象方法的能力.通过此项功能可将PHP集成进已有的基于Java的应用程序.如果你正在工作场合推广PHP ,这项功能尤其显得时髦."Java无处不在." 为实现此功能,你需要在服务器上安装Java虚拟机(JVM).如果你将安装(或已安装)来自Sun.Kaffe.IBM或Blackdown的JDK,则可以迅速开始工作. 当配置PHP时,需要对配置指令增加--with-java参数,然后修改php.ini文件中部分元素.php.ini 中通常

用Java SE 6.0实现高质量桌面集成开发

提要:本文将以具体的实例向你展示Java SE 6在桌面开发中所提供的一系列优秀特征. 一. 引言 随着Java SE 6 Beta的发行,Java开发者再也不需要自己去实现Java本机接口(JNI)便可以在其应用程序中加入桌面产品所具有的特征.这些桌面集成特征现在已成为内核的一个组成部分. 最新的Java标准版本6.0(代码名为Mustang)将在功能上进行一系列的改进--开发者们能够方便地用Java处理安全,JMX,操作系统文件,国际化和桌面开发等一系列问题.Sun在开发这个版本的过程中表现

PHP脚本的10个技巧(转自ZDNet) --PHP和Java

技巧|脚本 PHP和Java PHP功能的另外一个高招是其调用已有Java对象的方法的能力,这种功能可以让你把PHP集成进已有的基于Java的应用程序.如果你正在你的工作场合推广PHP ,那你算找到可大吹特吹的靓点了,你知道,Java这玩艺儿无处不在. 为了用到这一功能,你需要在服务器上安装Java虚拟机(JVM).如果你打算安装(或已经安装了)来自Sun.Kaffe.IBM或Blackdown的JDK,那你现在可谓已入正途. 当你配置PHP的时候,你将需要给配置指令增加--with-java参