六大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

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

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

相关文章

解决socket 粘包的三种方法

在socket编程中,当服务器连续向客户机发送两条指令时,就容易发生粘包 解决方法 1.sleep()通过睡眠来隔断两条语句 2、设置一条回执语句,当对方接受完信息后返回一个值 3根本解决: 通过在客户端程序中来确定…

用Jquery实现选项卡功能

jQuery实现选项卡功能。首先将界面搭建好。有导航头tab_menu,还有内容tab_box。要实现的效果就是,点击后,将相应的内容显示出来,其他内容隐藏掉。同时为了展现选中状态,为选中的项添加背景,以示区别。 这一…

帝国模板php代码,让帝国cms搜索页模板支持php代码

1.在/e/search/result/index.php头上加入require(../../class/functions.php);2.在/e/search/result/index.php 120行左右//替换公共模板变量$listtemp$tempr[temptext];这行代码之前加上$tempr[temptext]DtNewsBq(list.$tempr[tempid],$tempr[temptext],0);完整代码如下&#…

【刷题】BZOJ 4176 Lucas的数论

Description 去年的Lucas非常喜欢数论题&#xff0c;但是一年以后的Lucas却不那么喜欢了。 在整理以前的试题时&#xff0c;发现了这样一道题目“求Sigma(f(i)),其中1<i<N”&#xff0c;其中 表示i的约数个数。他现在长大了&#xff0c;题目也变难了。 求如下表达式的值&…

寻找缺少的堆栈跟踪

我们最近在博客中发表的一篇评论带回了有关特定体验的一些回忆。 我希望我没有经历过的那种经历。 在我们创建Plumbr之前很长时间&#xff0c;我正在调试一个应用程序&#xff0c;该应用程序每次在蓝月亮时都会给我一个例外。 详细程度令人震惊&#xff1a; java.lang.NullPoi…

HTML5--新增拖放事件(7)

前言&#xff1a; 这节课主要学习HTML5中新增的拖放事件(drag/drop)。 拖放事件 1.启用&#xff1a;HTML5中&#xff0c;如果想拖拽元素&#xff0c;给元素添加draggable true的属性&#xff0c;图像和a标签默认是可以进行拖拽的。 2.拖拽事件&#xff1a; 1.应用于被拖拽元素…

Django 用 uploadify 实现图片批量上传

分享一下在Django中使用uploadify——一个jQuery批量上传插件——的方法。github上的django-uploadify使用的是2.1.4版本&#xff0c;上传button只能使用图片&#xff0c;不能很方便的修改样式。本文针对的是uploadify 3.0.0版本。uploadify可以结合Django自身的ImageField&…

php判断记录,PHP判断数据库中的记录是否存在的方法,php数据库_PHP教程

PHP判断数据库中的记录是否存在的方法&#xff0c;php数据库本文实例讲述了PHP判断数据库中的记录是否存在的方法。分享给大家供大家参考。具体实现代码如下&#xff1a;复制代码 代码如下:$sql"select * from checklist where game_id$gid and task$task and status$stat…

Java DB中的Java存储过程

1 Java存储过程 这篇文章是关于Java DB中的Java存储过程的。 Java DB是基于Java编程语言和SQL的关系数据库管理系统。 这是Apache软件基金会的开源Derby项目的Oracle版本。 Java SE 7 SDK中包含Java DB。 在数据库内调用的Java代码是一个存储过程&#xff08;或多个过程&…

一些职场感想

教训 不要相信领导给你画的大饼 离开了&#xff0c;就不要回去 他说的为你好&#xff0c;都是套路而已 你会比你想象的更优秀 不要认为提增加工资不好意思&#xff0c;你不提&#xff0c;他永远不会给你加工资 怎么才算努力 这就看你所处的队友是怎么样的&#xff1b;如果队友是…

php聊天室发送表情,聊天室技术(六)-- 表情和动作_PHP

表情和动作极大的丰富了聊天的乐趣,一般的聊天室主要通过2种方法发送(1) 按钮菜单的方法通过在一个固定的下拉菜单里面进行选择,找到自己满意的表情,然后选中,按发送按钮发出(2) 通过手工输入代号比如网易的以手工输入 //hello 代表欢迎的一段动作,以 //bye 代表再见的一段动作…

Java 8的新增功能(第I部分-JavaFX)

免责声明&#xff1a;我不为Oracle工作&#xff0c;也不以任何方式代表Oracle。 此功能列表不是官方的。 作为“局外人”&#xff0c;这只是我研究的一部分。 Java 8已在大约两个月前完成功能&#xff0c;并且开发者预览版即将来临&#xff08;两周后&#xff09;。 这篇博客文…

mysql数据库sql语句优化

昨天帮同事优化了一个sql语句发出来共勉下: SELECT T.*, ( SELECT S.codeName FROM sys_codelist S WHERE S.codeValue T.packagingtype AND S.kindCode PACKAGING ) AS packagingtypeName, S.codeName AS codename, ( SELECT picpath FROM zl_b_gd_pic WHERE 1 1 AND gdid …

CopyPropertis

commons-beanutils.jar PropertyUtils.copyProperties(Object dest, Object orig) spring-beans.jar BeanUtils.copyProperties(Object source, Object target)CopyPropertis对List的操作需要手动转载于:https://www.cnblogs.com/xingzc/p/8663119.html

java调用外联服务用xml,Spring IOC 依赖注入的两种方式:XML和注解

IoC&#xff0c;直观地讲&#xff0c;就是容器控制程序之间的关系&#xff0c;而非传统实现中&#xff0c;由程序代码直接操控。这也就是所谓“控制反转”的概念所在。控制权由应用代码中转到了外部容器&#xff0c;控制权的转移是所谓反转。IoC还有另外一个名字——“依赖注入…

Wicket模型的干净方法

Apache Wicket Web框架的核心概念之一是模型和IModel作为其编程接口。 Wicket组件严重依赖模型&#xff0c;这使它们成为体系结构的重要组成部分。 Apache Wicket是一个有状态框架&#xff0c;将页面及其组件存储到通常位于HTTP会话中的页面存储中。 组件根据模型的内容创建面向…

jquery选择器大全

jQuery 选择器大全选择器 实例 选取 * $("*") 所有元素 #id $("#lastname") id"lastname" 的元素 .class $(".intro") 所有 class"intro" 的元素 element $("p") 所有 <p> 元素 .class.class $(".intr…

第7章 输入/输出系统

总览 I/O系统基本概念 外部设备 输入设备&#xff1a;键盘、鼠标 输出设备&#xff1a;显示器、打印机 外存储器&#xff1a;硬盘存储器、磁盘阵列、光盘存储器 I/O接口 I/O接口的功能和基本结构 I/O端口及其编址 I/O方式 程序查询方式 程序中断方式 中断的基本概念&#xff0c…

python第一个程序HelloWorld

在写第一个python程序之前&#xff0c;我们还需要了解的一个东西就是python解释器 解释器&#xff0c;顾名思义&#xff0c;就是解释一段代码的机器&#xff0c;程序运行的平台&#xff0c;例如Java的解释器就是jdk。 我们在写好的python代码&#xff0c;需要在解释器上执行&am…

Java字符串的十大问题

以下是有关Java字符串的十大常见问题 。 1.如何比较字符串&#xff1f; 使用“ ”还是使用equals&#xff08;&#xff09;&#xff1f; 简而言之&#xff0c;“ ”测试引用是否相等&#xff0c;而equals&#xff08;&#xff09;测试值是否相等。 除非您要检查两个字符串是否…