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

java六大原则_六大Java功能相关推荐

  1. java solid设计原则_六大设计原则之里氏替换原则(LSP)

    一.SOLID 设计模式的六大原则有: Single Responsibility Principle:单一职责原则 Open Closed Principle:开闭原则 Liskov Substit ...

  2. java 设计原则_【无尽的编程之路】(java)-设计模式六大原则

    本文主内容主要是列出各项原则的定义与本人对六大原则的感悟.写出来的目是想与大家分享与讨论.正如有句话叫做一千个读者眼中有一千个哈姆雷特,如果大家对这六项原则的理解跟我有所不同,欢迎留言,大家共同探讨. ...

  3. python三大特征六大原则_面向对象程序设计(Object Oriented Programming)的三大特性,六大原则...

    三大特性 封装.继承.多态性 拿简单工厂模式举例: namespace DesignMode_01 { // 计算基类 public class Operation { private double ...

  4. python三大特征六大原则_设计模式-来玩魔王的咚!-51CTO博客

    每一个设计模式系统的命名.解释和评价了面向对象系统中一个重要的和重复出现的设计.这里面向对象划重点,意思是所有的设计模式都是针对面向对象的提出的. 设计模式的4个基本要素: 模式名称 问题 解决方案 ...

  5. java 画笔粗细_用JAVA做个画笔,有画笔和橡皮功能就行。越简单越好

    展开全部 新建一个java文件,取名叫做PaintJava.java 代码如下: import java.applet.*; import java.awt.*; import java.awt.ev ...

  6. java俄罗斯方块程序_使用JAVA编写的俄罗斯方块程序, 具有非常全面的功能.

    Lastsong-Tetris 使用JAVA编写的俄罗斯方块程序, 具有非常全面的功能. 游戏基本规则: 1.打开游戏窗口后, 点击开始按钮进行游戏; 2.每消一行就会增加10分和1消行数,当分数累计 ...

  7. java 写字板_用Java实现写字板功能!

    原标题:用Java实现写字板功能! import java.awt.Color; import java.awt.Container; import java.awt.FlowLayout; impo ...

  8. java array缓存_有java数组

    [JAVA零基础入门系列]Day10 Java中的数组 [JAVA零基础入门系列](已完结)导航目录 Day1 开发环境搭建 Day2 Java集成开发环境IDEA Day3 Java基本数据类型 D ...

  9. java武功秘籍_请问java全套内容都有什么呢?

    我整理的Java全套内容学习路线,分为6个阶段(大阶段)第一阶段:java内功心法篇 第二阶段:Java武功秘籍(经典框架) 第三阶段:Java高级功法(主流框架) 第四阶段:Java成神之路 第五阶 ...

最新文章

  1. java 多线程 信号_Java多线程——Semaphore信号灯
  2. Ninja提升编译速度的方法-Android10.0编译系统(十)
  3. 洛谷2051 [AHOI2009]中国象棋
  4. string 与 c style 字符串的效率测试
  5. c语言程序设计了解,C语言程序设计
  6. mba数学-幂学-2016
  7. 千千万万的IT开发工程师路在何方?
  8. ulimit限制 新系统_graylog日志分析系统上手教程
  9. Android 系统各个版本上https的抓包
  10. 基于Verilog的贪吃蛇小游戏设计(附代码)
  11. SolidWorks2016安装
  12. 洛谷 【入门1】顺序结构 P5708 【深基2.习2】三角形面积
  13. Windows10服务优化
  14. 搜索爬行原理_使用Diffbot爬行和搜索整个域
  15. 鸭梨山大,格力战双11有何苦衷?
  16. 为什么你的蓝牙耳机总是出毛病,不好好反思一下这些问题吗?
  17. Discuz!教程之门户列表页文章中无图片时,从图库中选择一张作为封面
  18. 【Python字符串】
  19. lds链接脚本基础与例子分析
  20. 今天,我们算一算数据中心停机的账

热门文章

  1. 动态规划训练5 [回文词]
  2. Sentinel(十一)之黑白名单控制
  3. 非阻塞线程安全列表——ConcurrentLinkedDeque应用举例
  4. Oracle入门(十二E)之视图操作
  5. python打包exe文件
  6. 用数组存储字符C进行回文检测
  7. springboot项目不加端口号也可以访问项目的方法
  8. MyBatisPlus(基于starter和Bean方式)
  9. 对查询出来的结果进行筛选(having)
  10. Localdatetime