java六大原则_六大Java功能

java六大原则

我花了无数小时来对不同的应用程序进行故障排除。 通过经验,我可以得出关于大多数开发人员应该远离的几个Java SE功能/ API的结论。 当我提到大多数开发人员时,我会想到常规的Java EE开发人员,而不是库设计人员/基础结构工程师。

全面披露:老实说,我确实认为,从长远来看,大多数团队最好远离以下功能。 但是像往常一样,也有例外。 如果您有强大的团队并且完全了解自己在做什么,请继续。 但是,在大多数情况下,如果您开始在军械库中包括以下工具,从长远来看,您会后悔的:

  • 反射
  • 字节码操作
  • ThreadLocals
  • 类加载器
  • 弱/软引用
  • 插座

但是足够的介绍,让我仔细阅读警告标志列表,并附上潜在问题的解释:

反思 。 在诸如Spring和Hibernate之类的流行库中,反射有其应有的地位。 但是对业务代码进行内省是很糟糕的,原因有很多,我几乎总是建议避免使用它:

首先是代码可读性/工具支持。 打开您喜欢的IDE,并在Java代码中找到相互依赖的关系。 很简单,不是吗? 现在,将方法调用替换为反射并尝试重复该过程。 当您开始修改通常应该封装的状态时,事情变得更加失控。 如果需要一个示例,请看以下代码:

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()参数中输入错误。 您可能还记得,发现运行时错误比被构建脚本拒绝要复杂得多。

最后,会有开销。 JIT对反射调用进行了不同的优化。 有些优化需要更长的时间才能应用,有些甚至无法应用。 因此,有时对反射的性能损失可能是几个数量级。 但是,在典型的业务应用程序上,您不会真正注意到开销,因此,这绝对可以减少麻烦。

总而言之,我可以指出,您的业务代码中唯一合理的(间接)反射用法是通过AOP 。 除此之外,您最好远离反射。

字节码操作 。 如果我看到您直接使用CGLIB或ASM您的Java EE应用程序代码,我感觉我立即想逃脱。 考虑我在反射块中阐述的原因,将影响倍增五倍,您可能会开始感到痛苦。

更糟糕的是,您在编译期间看不到可执行代码。 本质上,您不知道生产中实际上正在运行什么代码。 因此,当遇到麻烦时,您将不得不进行运行时故障排除和调试-如果您与我一致,这将花费更多的时间。

ThreadLocals 。 为什么在业务代码中看到ThreadLocals让我感到颤抖,有两个不相关的原因。 首先,在ThreadLocals的帮助下,您可能开始感觉到使用变量的诱惑,而无需将它们显式传递给方法调用链。 在某些情况下可能有用。 但是当您不小心的时候,我可以保证您最终会在代码内创建许多意外的依赖项。

第二个原因与我的日常工作有关。 将数据存储在ThreadLocals中可以建立一条通往内存泄漏的通道。 我所面对的10个Permgen泄漏中至少有1个是由广泛的ThreadLocal使用引起的。 与类加载器和线程池结合使用 ,很好的旧“ java.lang.OutOfMemoryError:Permgen空间”指日可待。

类加载器 。 首先,类加载器是一个复杂的野兽。 您必须首先了解它们,层次结构,委派机制,类缓存等。即使您认为已经理解了它们,第一次(十次)尝试仍将无法正常进行。 至少您最终将导致类加载器泄漏。 因此,我只能建议将此任务留给应用程序服务器。

弱引用和软引用 。 刚刚了解了它们是什么以及它们如何工作? 好。 现在您对Java的内在有了更好的了解。 有一个用软引用重写所有缓存的好主意吗? 不好。 我确实知道,配备锤子会使您四处寻找钉子。

为什么我觉得对于这种锤子而言,缓存不是一个好主意,您可能会怀疑。 毕竟,在软引用上构建缓存可能是一个很好的例子,说明如何将某些复杂性委托给GC而不是自己实现。

让我们以任意缓存为例。 您可以使用值的软引用来构建它,以便在内存用尽时可以进入GC并开始清洁。 但是现在您无法控制从缓存中删除了哪些对象,并且很有可能在下次缓存未命中时重新创建它们。 如果内存仍然不足,则触发GC再次清理它们。 我想您会看到恶性循环的形成,并且您的应用程序在持续运行Full GC的情况下成为CPU约束。

插座 。 普通的java.net.Socket太棘手,无法正确执行。 我确实认为,由于其阻塞性,它从根本上是有缺陷的。 当使用基于Web的前端编写典型的Java EE应用程序时,您需要高度的并发性来支持众多用户。 您现在不希望发生的事情是让您的所有线程池都不那么可扩展,以等待阻塞的套接字。

但是,还有许多出色的第三方库可用于手头的任务,因此,与其尝试自己解决问题,不如去抢购Netty 。

参考: Plumbr Blog博客上的六种Java功能使我们远离 JCG合作伙伴 Nikita Salnikov Tarnovski 。

翻译自: https://www.javacodegeeks.com/2013/09/six-java-features-to-stay-away-from.html

java六大原则

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/346827.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

打开虚拟机磁盘类型无效_[图文]VMWARE虚拟机如何打开.VMDK格式的磁盘映像

最近在折腾安卓虚拟机时使用Android x86项目组提供的镜像,架构问题本身无法直接在电脑安装安卓系统。而Android x86项目则是国外团队通过源代码进行移植的版本,虽然不能同步更新但现在也倒是已经 8.1 版。至于折腾安卓虚拟机的原因则是手头的安卓机还是4…

Apache Ivy 2.5.0-rc1发布–现在允许解析器超时

几周前,我们发布了Apache Ivy的2.5.0-rc1版本。 Apache Ivy是一个依赖项管理构建工具,通常与Apache Ant结合使用。 可在项目下载页面上下载 自Apache Ivy的上一版本于2014年12月发布以来,此版本具有重要意义。距上一个正式年份已超过3年。 在…

感量越大抑制频率约低_脉冲信号是什么?它与频率,占空比,正、负逻辑间是什么关系?...

在数字电子系统中,所有传送的信号均为开关量,即只有两种状态的电信号,这种电信号,我们称作做脉冲信号,这是所有数字电路中的基本电信号一个标准的脉冲信号如下图所示。我们把脉冲信号由低电压跳变至高电压的脉冲信号边…

datagrid 小数点_EasyUI 解决 datagrid 中 NumberBox 限制小数位数后不能输入小数点问题...

初始化界面,发现编辑datagrid,不能输入小数点。var arrColumnsCNT [[{title: 毛重,field: GrossWeight,halign: center,width: 60,sortable: true,frozen: true,editor: {type: numberbox,options:{precision:2}}}]];function DefDataGridCNT() {objDat…

【OFDM系列9】OFDM采用正交区分不同子载波的,但是子载波通过调相后携带了基带信号后,如何还能继续保证两者正交

不经意间在知乎看到这样一个问题,在此记录一下我的看法 OFDM采用正交区分不同子载波的,但是子载波通过调相后携带了基带信号后,如何还能继续保证两者正交? 补充内容是:OFDM是指通过2组正交载波传递信息,但…

使用threadlocal_何时以及如何使用ThreadLocal

使用threadlocal正如我们的读者可能已经猜到的那样,我每天都会处理内存泄漏。 最近,一种特殊类型的OutOfMemoryError消息开始引起我的注意-滥用ThreadLocals引发的问题变得越来越频繁。 在查看此类泄漏的原因时,我开始相信其中一半以上是由于…

企业为什么要开通银企直联_企业为什么要做网站推广

随着现代社会的发展,如果企业不做网站推广,那么可以说是寸步难行,今天就来为大家说说企业为什么一 定要做网站推广的详情!1 、网络品牌推广做网络营销的结果就是在互联网要有自己的品牌,并且可以再网络上得到无限性的延…

在Java错误产生之前对其进行处理的新方法

我们如何认识到解决预生产错误的旧方法还不够,以及我们如何能够改变这种情况 第一次尝试时就没有完美的代码,我们所有人都可以证明我们已经学到了很难的方法。 不管我们使用多少测试周期,代码审查或工具,总有至少一个偷偷摸摸的错…

学术诚信的重要性_申论作文开头之诚信

本段是经典开头或过渡段落写作,通过反面论证引出总论点重要性,结构清晰,层次感强,本段可以适用于公民道德与诚信建设问题、食品安全问题、环境污染等等,其中影响及重要性分析语句可以用于申论作文的开头部分&#xff0…

curl 访问不到html_嵌入式工程师入门前后端系列1:访问一个网页

做为嵌入式行业的从业者,最近经常听到PAAS,SAAS等和”云”相关的概念,被整的一头雾水。很多时候咱们的物联网硬件设备都会有一个云平台,用于设备管理或者UI应用展示等功能,这通常是由专门的前后端工程师配合美工一起完…

java:8最小镜像_Java:本地最小语言

java:8最小镜像在1996年至2002年之间,我用Java编写了成千上万行代码。我用Java 1.0到Java 1.4编写了Web框架,电子表格以及更多内容。 与90年代中期(预模板)的C 相比,Java是一种完全令人惊奇的语言。 JVM是所有计算机语…

seaborn无法import_无法导入seaborn

我在进口seaborn时有问题。我最近在我的电脑上安装了“Python”,并尝试使用seaborn pacjesge。我更新了scipy和{}。实际上,在更新scipy之前,python看不到{}。问题是什么?请帮帮我Python 2.7.10 |Anaconda 2.3.0 (64-bit)| (defaul…

project子项目之间任务关联_project项目任务类型,就这么简单

任务是Project中最重要的概念之一,它是组成项目的基本元素。在Project项目管理软件中,任务的类型被分为三类,它们分别是固定单位任务,固定工期任务和固定工时任务。对这些任务类型的认识和了解,项目团队可以充分的协调…

邪恶的Java技巧使JVM忘记检查异常

我长期以来一直批评Java中的编译器检查异常机制。 无论您是爱还是恨,都可以肯定一件事:在某些情况下,您不想与他们打交道。 Java中的解决方案是将一个检查过的异常包装在new RuntimeException(e)但这可以提供较长的堆栈跟踪,而无需…

盲僧一键r闪用什么设置_美加狮R.A.T. PRO X3至尊版带你畅玩模拟飞行

很多模拟飞行或者皇牌空战的玩家们都追求在游戏过程中的真实驾驶体验,渴望通过游戏来实现自己的飞行梦。但普通鼠标的左右键及滚轮并不能带给玩家逼真的体验,美加狮全新发布的鼠标R.A.T. PRO X3至尊版却可以做到。美加狮R.A.T. PRO X3至尊版是美加狮全新…

input标签的值只能两位小数_Day51 HTML表格表单标签、flask框架

目录表格标签表单标签action标签input标签select标签textarea标签form表单提交文件需要注意flask框架1、表格标签<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>表格标签</title><meta name…

maven检测依赖_检测Maven依赖中介

maven检测依赖从Maven 2.0.9开始&#xff0c;已向Maven添加了一个称为依赖中介的新功能。 依赖关系中介是Maven在特定情况下在依赖关系树中多次出现依赖关系时用来解决项目依赖关系的技术。 通常&#xff0c;这发生在通过项目的依赖关系链接的传递依赖关系上。 在这些情况下&am…

webservice 参数太大_手把手系列:常用数据交换方案Web Service接口处理法

手把手系列&#xff1a;常用数据交换方案之Web Service接口处理法Web Service是一个SOA(面向服务的编程)的架构&#xff0c;是一个平台独立的&#xff0c;低耦合的&#xff0c;基于可编程的web的应用程序&#xff0c;可使用开放的XML标准来描述、发布、发现、协调和配置这些应用…

在事务外自动保存托管JPA实体

Spring中的存储库和事务并存。 Spring中的所有数据库访问都应在事务内运行&#xff0c;并且通常在某个地方使用Transactional来强制执行此操作。 但是&#xff0c;这并非总是必要的。 例如&#xff0c;当使用Spring Data时&#xff0c;您的存储库使用SimpleJPARepository来实现…

点击事件为什么会失效_Spring事务原理?事务在方法间如何传播?为什么会失效?...

推荐学习疯狂膜拜&#xff01;阿里出品Spring Security王者晋级文档肝了十天半月&#xff0c;献上纯手绘“Spring/Cloud/Boot/MVC”全家桶脑图前言事务我们都知道是什么&#xff0c;而Spring事务就是在数据库之上利用AOP提供声明式事务和编程式事务帮助我们简化开发&#xff0c…