Java功能的适用性

Java语言和标准库功能强大,但功能强大, 责任重大 。 一方面看到很多用户代码滥用或滥用稀有的Java功能,另一方面却完全忘记了大多数基本功能之后,我决定撰写此摘要。 这不是每个Java开发人员都应该探索,了解和使用的要求和领域的列表。 相反! 我将Java功能分为三类: 日常偶尔从不(仅框架和库) 。 规则很简单:如果您发现自己经常使用给定功能,然后建议使用该功能,则可能是工程过度或试图构建过于笼统且可重复使用的功能。 如果您没有足够频繁地使用给定功能(根据我的主观清单),则可能会错过一些真正有趣且重要的机会。

请注意,我只关注Java,JVM和JDK。 我不建议您使用哪些框架以及使用的可能性。 我还假设了典型的服务器端面向业务的应用程序。

日复一日

假定每天都要使用Java语言的以下功能。 如果您从未见过它们,或者很少使用它们,则可以仔细看看,它们确实很有帮助:

  • 类,接口,包 –认真。 将您的代码放在类中。 您还记得大学时曾说过,类是封装的数据+对数据起作用的方法吗? 仅具有状态的类几乎不是一个结构。 仅包含方法的类只是一个包含函数的名称空间。 必要时也请使用接口。 但是在创建仅具有一个实现的接口之前,请三思而后行。 也许您不需要中间人? 但是,请遵循完善的命名约定将所有内容打包放入软件包中。
  • 静态方法 –不要害怕它们。 但是,仅将它们用于无状态实用程序方法。 永远不要在static方法中编码任何业务逻辑。
  • ExecutorService –线程池 –必须创建并有效使用线程池,了解排队和Future<T>工作方式。 不要重新实现线程池,每当有人说生产者-消费者时都要考虑一下它们。
  • Atomic -*系列 –不要使用synchronized来勉强读取/更新某些计数器或原子引用。 Atomic *系列类使用有效的比较和交换低级指令来达到惊人的效率。 确保您了解这些类提供的保证。
  • 设计模式 –从技术上讲不是Java语言的一部分,而是必不可少的。 您应该,知道,了解和使用它们,但要谨慎而谨慎。 就像使用界面一样-不要太过分。 GoF甚至EI模式通常应出现在代码库中。 但是,让模式出现在您的思维过程中,而不是让思维过程受模式驱动。
  • 内置集合(包括并发集合) –您绝对必须了解并使用内置集合,并了解ListMapSet之间的区别。 使用线程安全的集合对您来说不是问题。 了解性能特征并对其背后的实现进行基本概述。 这真的很基本。 还知道并使用各种BlockingQueue实现。 并发很困难,不要自己重新实现其中的一些东西就更难了。
  • 内置的注释 -注释是在这里留下来,学会使用@Override (和@Deprecated在一定程度上)每天一致。
  • 异常 –使用未经检查的异常来表示异常,异常失败,需要采取措施。 了解如何处理受检查的异常。 学习阅读堆栈跟踪。
  • 尝试使用资源 –熟悉这种神话般的语言构造。 如果您的班级需要任何清理,请实施AutoCloseable
  • 阻止IO –使用Reader / WriterInputStream / OutputStream类是您应该真正熟悉的东西。 理解它们之间的区别,不用担心就使用缓冲和其他装饰器。

这将结束您应使用的日常工具的列表。 如果您从未听说过或仅偶尔使用过它们,请仔细研究它们,因为它们可能会成为您的救星。

偶尔

以下是您不应该害怕使用的语言功能,但也不应滥用它们。 如果您发现自己每天都在利用它们,或者在午餐前几次看到这些功能,那么您的设计可能有问题。 我从后端企业Java开发人员的角度来看。 这些类型的功能很有用,但不太常用。

  • 继承和抽象类 –实际上,事实证明,我不经常使用继承,而且我也不是很想念它。 由接口驱动的多态性要灵活得多,尤其是在Java中缺乏特性的情况下。 比起继承,也更喜欢组合 。 太多级别的继承会导致代码难以维护。
  • 正则表达式有些人遇到问题时会认为“我知道,我会使用正则表达式”。 现在他们有两个问题。 。 没有正则表达式的世界将更加无聊和麻烦。 它们对于解析常规语言(而不是HTML )非常有用,但是它太容易过度使用了。 如果您发现自己整天都在正则表达式之前进行制作,测试,修复和维护,则可能是在使用错误的工具来完成这项工作。 我一直以来最喜欢的:
    public static boolean isNegative(int x) {return Integer.toString(x).matches('-[0-9]+');
    }
  • SemaphoreCountDownLatchCyclicBarrier –与infomous wait() / notify()对相比,它们在一个数量级上都非常有用。 但是即使滥用它们,也不会阻止您出现并发错误。 当您经常看到这些同步机制时,请考虑线程安全的集合或某些框架。
  • 用户代码中的泛型类型 –使用内置集合和具有泛型类型的其他类不仅应该是日常实践,而且对您来说应该显而易见。 但是我的意思是自己开发代码,以获取或返回通用类型。 像这样:
    public <T, F> ContractValidator<T extends Contract> T validate(Validator<T>, F object)

    有时有必要在您自己的代码中使用泛型,但不要太meta- 。 当然,静态类型和类型安全应该是您的首要任务,但是也许您可以避免使用太多的泛型,复杂类型?

  • JVM中的脚本语言 –您知道JDK具有内置JavaScript解释器吗? 而且您几乎可以插入其他任何语言,例如Groovy或JRuby? 有时,将小脚本嵌入应用程序中更为简单,即使客户也可以更改。 这种情况并不常见,但是在瞬息万变的市场中,重新部署可能不是一种选择。 只需记住,如果脚本代码的总行数超过代码总数的1%,则应开始担心维护。
  • Java NIO –很难做到正确,甚至很难从中受益。 但是在极少数情况下,您实际上必须使用NIO压缩尽可能多的性能和可伸缩性。 但是,更喜欢可以为您执行此操作的库。 同样在正常情况下,阻塞IO通常就足够了。
  • synchronized关键字 –出于简单原因,您不应过于频繁地使用它。 它使用的次数越多,执行的频率就越高,从而影响性能。 请考虑使用线程安全的集合和原子原始包装器。 还要确保您始终了解哪个对象用作互斥体。

我认为上述功能很有价值且很重要,但不一定每天都在起作用。 如果您每天都看到其中的任何一个,则可能表示设计过度设计或……经验不足的开发人员。 经验带来简单。 但是,您可能也有非常不同的要求,这也适用于第三组。

永不(请考虑:仅框架和库开发人员)

您应该了解并理解以下功能背后的原理,以便了解框架和库。 而且您必须了解它们以有效地为我们服务,我认为如果有问题的人只是阅读所用库的代码,就可以避免有关StackOverflow的太多问题。 但是理解并不意味着使用。 您几乎永远都不要直接使用它们,它们大多是高级的,肮脏的和复杂的。 即使出现这种功能,也可能导致严重的头痛。

  • 套接字 –认真地说,套接字。 您必须了解TCP / IP堆栈的工作原理,在线程方面要非常自觉,在解释数据时要小心,对流保持警惕。 远离使用纯套接字,有数百个将它们包装起来并提供更高级别抽象的库– HTTP,FTP,NTP,SMB,电子邮件…(例如,请参见Apache Commons net )。 您会惊讶于编写体面的HTTP客户端或服务器有多么困难。 而且,如果您需要为某些专有协议编写服务器,请绝对考虑使用Netty 。
  • 反思 –在业务代码中没有内省类和方法的地方。 框架离不开反思,我离不开。 反射会使您的代码变慢,不安全且难看。 通常,AOP就足够了。 我什至会说传递Class<T>实例是一种代码味道。
  • 动态代理和字节码操作Proxy类很棒,但就像反射一样,仅应由支持您的框架和库使用。 它们是轻量级AOP的基本构建块。 如果您的业务应用程序(不是框架或库,甚至Mockito都使用这些技术!)需要字节码生成或操作(例如ASM或CGLIB )– 你陷入了深渊 我会为你祈祷。
  • 类加载器 –与类加载器有关的所有内容。 您必须了解它们,层次结构,字节码等。但是,如果您编写自己的类加载器,那将是通往地狱的道路。 并不是说它是如此复杂,但是它可能是不必要的。 留给应用服务器。
  • Object.html#clone() –老实说,我不记得我是否在整个(Java开发人员)生命中都使用过这种方法。 我只是……没有……而且我找不到使用它的任何理由。 我要么有一个显式的复制构造函数,要么更好地使用不可变对象。 您有任何合法的用例吗? 好像是1990年代...
  • 本机方法 – JDK中有一些方法 ,即使对于诸如计算正弦函数之类的小任务也是如此。 但是Java不再是全班最慢的孩子,实际上恰恰相反。 另外,我无法想象使用标准库或第三方库无法实现哪种逻辑。 最后,本机方法很难正确解决,您会遇到低级的,令人讨厌的错误,尤其是在内存管理方面。
  • 自定义集合 -遵循原始JavaDoc中定义的所有合同实施全新集合非常困难 。 像Hibernate这样的框架使用特殊的持久化集合。 很少需要一个针对您的需求的集合,以至于内置集合都不够好。
  • ThreadLocal –库和框架经常使用线程局部变量。 但是出于两个不相关的原因,您永远不要尝试利用它们。 首先, ThreadLocal通常是您想潜入的隐藏半全局参数。 这使您的代码难以推理和测试。 其次,如果未正确清理ThreadLocal很容易引入内存泄漏(请参阅this , this , this和this和…)
  • WeakReference和SoftReference –这些类是相当低级的,在实现与垃圾回收良好配合的缓存时非常有用。 幸运的是,有很多开源缓存库,因此您不必自己编写。 了解这些类的作用,但不要使用它们。
  • com.sun.*sun.*软件包,尤其是sun.misc.Unsafe –远离这些软件包,只是……不要去那里。 没有理由探索这些专有的,未记录的文档,并且不能保证保留向后兼容的类。 只是假装他们不在那里。 为什么要使用Unsafe

当然,上面的列表是完全主观的,很可能不是确定的。 如果您认为某些物品放置在错误的位置或完全丢失了某些物品,建议您提出评论和建议。 我想构建一个摘要,可以在代码审查期间或评估项目时作为参考。

参考: Java具有 JCG合作伙伴 Tomasz Nurkiewicz在Java及社区博客上的适用性 。

翻译自: https://www.javacodegeeks.com/2012/10/java-features-applicability.html

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

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

相关文章

台达b3伺服modbus通讯_【数控系统】台达伺服压机控制灵活 精准压合满足各种工序需求...

引言压机是一种利用压力改变工件形状的机械设备。随着制造业少量多样与客制化的日趋发展&#xff0c;压机的的优势逐渐显现&#xff0c;在汽车、五金与电子制造等产业中的应用不断增多。传统压机在使用操作上耗费人力并需要诸多压机元件才能完整运作&#xff0c;维修成本高&…

yolov4Linux,基于Darknet的YOLOv4目标检测

目录一、Windows环境下的YOLOv4目标检测1、环境配置环境准备&#xff1a;Win10、CUDA10.1、cuDNN7.65、Visual Studio 2019、OpenCV 3.4(1)Visual Studio2019企业版安装(3)下载并安装CUDA10.1&#xff0c;下载安装cuDNN7.65对于cudnn直接将其解开压缩包&#xff0c;然后需要将b…

二元置信椭圆r语言_医学统计与R语言:圆形树状图(circular dendrogram)

微信公众号&#xff1a;医学统计与R语言如果你觉得对你有帮助&#xff0c;欢迎转发输入1&#xff1a; "ggraph")结果1&#xff1a; name 输入2&#xff1a; <- graph_from_data_frame(myedges1, verticesmyvertices,directed T)ggraph(mygraph, layout dend…

Java:检查器框架

我在JavaOne 2012上 了解的有趣的工具之一是Checker Framework 。 Checker Framework的网页之一 指出 &#xff0c;Checker Framework“增强了Java的类型系统&#xff0c;使其更强大&#xff0c;更有用”&#xff0c;从而使软件开发人员“能够检测并防止Java程序中的错误”。 查…

南岸焊接机器人厂_造船三部高效焊接工艺技术年鉴

为了提升公司高效焊自动化率&#xff0c;实现降本增效目标&#xff0c;造船事业三部积极响应公司领导号召&#xff0c;充分挖掘自身资源&#xff0c;2020年&#xff0c;在高效焊接技术、设备开发研究等方面&#xff0c;不断创新、敢于突破&#xff0c;获取了多项焊接新技术、新…

线性回归csv数据集_测试数据科学家线性回归的30个问题

你的目标是数据科学家吗&#xff1f;那你对线性回归了解有多深入呢&#xff0c;下面的30道题&#xff0c;可以帮助你或者测试别人是否真的达到的数据科学家的水平&#xff0c;关注回复&#xff0c;答案在评论区&#xff1a;1)是非题&#xff1a;线性回归是一种受监督的机器学习…

dw空心圆项目符号_如何懂建筑施工图?搞懂这些符号解析,耐下性子研究不会学不会...

施工图纸一个建筑方向&#xff0c;是房屋建筑的依据&#xff0c;更是一种工程语言&#xff0c;它能够明确的规定出我们建造出怎样的建筑&#xff0c;看懂它是入行基础。当然建筑图包含的因素比较多&#xff0c;有具体的建筑符号&#xff0c;尺寸、做法以及技术要求都在里面&…

canvas学习和滤镜实现

最近学习了 HTML5 中的重头戏--canvas。利用 canvas&#xff0c;前端人员可以很轻松地、进行图像处理。其 API 繁多&#xff0c;这次主要学习常用的 API&#xff0c;并且完成以下两个代码&#xff1a;实现去色滤镜实现负色(反色)滤镜 欢迎入群&#xff1a;857989948 。IT 技术深…

android代码混淆作用,Android分享:代码混淆那些事

1) 前言ProGuard是一个开源的Java代码混淆器。它可以混淆Android项目里面的java代码&#xff0c;对的&#xff0c;你没看错&#xff0c;仅仅是java代码。它是无法混淆Native代码&#xff0c;资源文件drawable、xml等。2) ProGuard作用压缩: 移除无效的类、属性、方法等优化: 优…

施工部署主要不包括_建筑工程施工方案及培训实例

[南京]大型土石方工程施工方案本资料为[南京]大型土石方工程施工方案格&#xff0c;共43页。内容简介&#xff1a;本工程位于南京化工园内&#xff0c;扬子玉带扬巴路附近&#xff0c;工程项目为江苏成品油管道配设施扬子玉带油库套油库工程&#xff0c;由中国石化股份有限公司…

java第六次作业

《Java技术》第六次作业 &#xff08;一&#xff09;学习总结 1.用思维导图对本周的学习内容进行总结。 2.当程序中出现异常时&#xff0c;JVM会依据方法调用顺序依次查找有关的错误处理程序。可使用printStackTrace 和getMessage方法了解异常发生的情况。阅读下面的程序&#…

华为鸿蒙不再孤,华为鸿蒙OS系统不再孤单!又一款国产系统启动内测:再掀国产替代化...

【5月10日讯】相信大家都知道&#xff0c;备受广大花粉们期待的鸿蒙OS系统终于开始推送公测版本了&#xff0c;并且适配机型也开始不断地增多&#xff0c;而根据华为官方最新消息&#xff0c;华为鸿蒙OS系统将会在6月份开始大规模推送正式版鸿蒙系统&#xff0c;这无疑将会成为…

CSS 水平垂直居中

方法一&#xff1a; 容器确定宽高&#xff1a;知识点&#xff1a;transform只能设置在display为block的元素上。 <head> <meta charset"UTF-8"> <title>Title</title> <style type"text/css"> #container{…

linux怎么进入文件夹_Linux基础命令《上》

上一节介绍了VMware中安装centos7以及克隆系统&#xff0c;之中用到的几个命名还都是开发不常用的&#xff0c;这节课就准备讲解一下入门的Linux命名&#xff0c;都是日常使用的。首先呢&#xff0c;我们进入系统后&#xff0c;得先知道我是谁&#xff0c;我在哪儿&#xff1f;…

UML学习(一)-----用例图

1、什么是用例图 用例图源于Jacobson的OOSE方法&#xff0c;用例图是需求分析的产物&#xff0c;描述了系统的参与者与系统进行交互的功能&#xff0c;是参与者所能观察和使用到的系统功能的模型图。它的主要目的就是帮助开发团队以一种可视化的方式理解系统的功能需求&#xf…

首款鸿蒙系统终端n,荣耀智慧屏正式发布,首款搭载鸿蒙系统终端,家庭C位新选择...

原标题&#xff1a;荣耀智慧屏正式发布&#xff0c;首款搭载鸿蒙系统终端&#xff0c;家庭C位新选择智能手机的普及率越来越高&#xff0c;其所能够承担的功能也越来越多&#xff0c;电视机对于很多中青年的用户来讲&#xff0c;更多的时候就是个摆设。在家庭中&#xff0c;看电…

oracle如何保证数据一致性和避免脏读

oracle通过undo保证一致性读和不发生脏读 1.不发生脏读2.一致性读3. 事务槽&#xff08;ITL&#xff09;小解1.不发生脏读 例如&#xff1a;用户A对表更新了&#xff0c;没有提交&#xff0c;用户B对进行查询&#xff0c;没有提交的更新不能出现在用户的查询结果中 举例并通个d…

Google Guava BloomFilter

当Guava项目发布版本11.0时&#xff0c;新添加的功能之一是BloomFilter类。 BloomFilter是唯一的数据结构&#xff0c;用于指示元素是否包含在集合中。 使BloomFilter有趣的是&#xff0c;它将指示元素是否绝对不包含或可能包含在集合中。 永远不会出现假阴性的特性使BloomFil…

php 编程祝新年快乐_用于测试自动化的7种编程语言

导读&#xff1a;本文重点介绍测试自动化中排名前七位的编程语言。当人们想要开始做自动化测试&#xff0c;此时却需要开发自动化测试脚本&#xff0c;也就是要学习一门编程语言。那么&#xff0c;我们怎样迈出这一步&#xff1f;也有你已经精通一种编程语言&#xff0c;也可以…

Vue.js开发环境搭建的介绍

包含了最基础的Vue.js的框架&#xff0c;包含了打包工具和测试工具&#xff0c;开发调试的最基本的服务器&#xff0c;不需要关注细节&#xff0c;只需关注Vuejs对项目的实现 npm在国内的网络使用较慢&#xff0c;所以推荐下载安装淘宝的镜像 1&#xff1a; 2&#xff1a;安装c…