java 适用参数_Java功能的适用性

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)

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

  • 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

java 适用参数

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

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

相关文章

linux查看tar进程进度,Linux:wget后台下载/查看后台任务进度

今天在自己的服务器上使用wget下载一个大文件时&#xff0c;不小心把ssh断开连接了&#xff0c;重新登上去后想查看这个文件的下载进度&#xff0c;现记录一些wget的知识点。1&#xff1a;后台下载使用wget -b url[root8f9fbda9bb48 ~]# wget -b http://cn.wordpress.org/word…

【redis】在windos下的redis服务器的搭建

1.下载Redis-x64-3.2.100&#xff08;楼主用的版本&#xff0c;需要安装包的可以找我要&#xff09; 下载官方版本 2.解压后在cmd下运行 redis-server redis.windos.conf 此时redis服务已经在该windows下6379端口运行 3.把该服务设置成windos服务 redis-server --service-insta…

《Linux网络接口》---------struct ifreq struct ifconf

网络接口--------------struct ifconf&#xff0c;struct ifreq 网络相关的ioctl请求的request参数及arg地址必须指向的数据类型如下表所示&#xff1a; 接口 SIOCGIFCONF SIOCSIFADDR SIOCGIFADDR SIOCSIFBRDADDR SIOCGIFBRDADDR SIOCSIFNETMASK SIOCGIFNETMASK 获取所有接口…

会议季Mic Drop:您不应该错过的13场Java演讲

您的老板没有派您参加真正的会议吗&#xff1f; 我们为您准备了最好的讲座 9月主要发生在一些重大事件上&#xff1a;秋季的第一天&#xff0c;甚至全国熏肉日。 这也是召开会议最忙的月份之一&#xff0c;一些大型Java事件涵盖了平台的新的重要更新。 在下面的帖子中&#x…

linux7设备的挂载,centos7磁盘分区与挂载解析

Linux系统在磁盘、U盘以及光盘等设备分区和挂载操做才能使用。centos1、磁盘分区原理与规则ui磁盘分区类型&#xff1a;主分区&#xff0c;扩展分区&#xff0c;逻辑分区this分区规则&#xff1a;centos7一、主分区扩展分区的数量不能超过4个&#xff0c;且扩展分区只能有1个。…

【公众号系列】SAP的新零售

公众号&#xff1a;SAP Technical本文作者&#xff1a;matinal原文出处&#xff1a;http://www.cnblogs.com/SAPmatinal/ 原文链接&#xff1a;【公众号系列】SAP的新零售写在前面 还是以前的一篇文章&#xff08;一八年三月&#xff09;&#xff0c;拿出来重新了解一下。 随着…

linux下汇编语言开发总结

汇编语言是直接对应系统指令集的低级语言&#xff0c;在语言越来越抽象的今天&#xff0c;汇编语言并不像高级语言那样使用广泛&#xff0c;仅仅在驱动程序&#xff0c;嵌入式系统等对性能要求苛刻的领域才能见到它们的身影。但是这并不表示汇编语言就已经没有用武之地了&#…

使用openocd调试Linux内核,openocd安装与调试

环境&#xff1a;硬件&#xff1a;PC机ARM仿真器v8.00已下载好bit流的Xinlinx SoC开发板(其上有arm cortex-a9核)软件&#xff1a;Redhat Linux6(或虚拟机) openocd使用openocd下载程序&#xff0c;调试arm cortex-a9核。一、openocd安装下载libusb库安装或直接yum install li…

execl中设置的格式无法实现

在一次项目中&#xff0c;需要导出execl表&#xff0c;并且要给表中的表格设置格式&#xff0c;因为每列的格式都不一样&#xff0c;需要单独设置设置这些格式&#xff0c;在后期使用中因为导入的数据过多&#xff0c;是的后面的单元格中设置的格式无法实现。 每次打开execl表格…

loadrunner监控linux性能指标,使用LoadRunner监控Linux系统性能.doc

使用LoadRunner监控Linux系统性能性能监控案例■秘密 □机密 □绝密PAGELinux系统性能监控案例(仅供内部使用)版 本 号&#xff1a;V0.1保 密 等 级&#xff1a;■秘密 □机密 □绝密编 制&#xff1a;XXX审 核&#xff1a;修订记录日期版本号描述作者2011-06-130.1初稿完成目录…

github gists_Eclipse中的Github Gists

github gists我想描述有关在Eclipse中集成GitHub Gists的简单步骤。 有几个来源促使我这样做&#xff1a; Eclipse的GitHub Mylyn连接器 EGit / GitHub /用户指南 http://eclipse.github.com 我一直在使用Eclipse Java EE发行版&#xff0c;其中已经安装了Mylyn插件&#…

分析.cpp文件编译生成的汇编文件里语句的作用

1234int main(int argc,char** argv){return 1;}1g -S test.cpp生成test.s汇编文件 .file"null-test.cpp".text.globl main.type main, functionmain:.LFB0:.cfi_startproc pushq %rbp.cfi_def_cfa_offset 16.cfi_offset 6, -16movq %rsp, %rbp.cfi_def_cfa…

vue-cli3.0使用及配置(部分)

好长一段时间没有关注vue脚手架了&#xff0c;昨天因为需要个后台模板&#xff0c;用脚手架 搞了一下&#xff0c;竟然发现指令不能用了&#xff0c;看官方文档已经升级3.0&#xff0c;也是试的玩了一下&#xff0c; 大致写写怎么玩的&#xff01;12341.先全局安装vue-cli3.0 …

centos arm-linux-gcc,CentOS 6.4配置arm-linux-gcc交叉环境

首先解压arm-linux-gcc到制定文件夹[armacer ~]$ sudo tar xvf arm-linux-gcc-3.4.5-glibc-2.3.6.tar.bz2 -C /opt/tool/配置环境变量&#xff1a;[armacer ~]$ sudo vi /etc/profile添加:PATH/opt/tool/gcc-3.4.5-glibc-2.3.6/bin:$PATHexport PATH保存退出。执行[armacer ~]$…

使用JavaSymbolSolver解决Java代码中的方法调用

为什么创建java-symbol-solver&#xff1f; 几年前&#xff0c;我开始使用JavaParser &#xff0c;然后开始做出贡献。 不久之后&#xff0c;我意识到我们想对Java代码执行的许多操作不能仅通过使用解析器生成的抽象语法树来完成&#xff0c;我们还需要解析类型&#xff0c;符号…

kali2.0安装搜狗输入法

其实方法应该是是通用的 &#xff08;一开始源要配置好&#xff1a; 修改软件源APT-sources.list [python] view plaincopy vim /etc/apt/sources.list 将原来的注释掉&#xff0c;加了个阿里的#阿里云kali源deb http://mirrors.aliyun.com/kali sana main non-free contrib…

linux+vim+动不了,linux的vim按了ctrl+s之后假死的解决办法

Aqua Data Studio中文乱码使用Aqua Data Studio 查询数据时,如果表中的数据有中文时,会显示乱码,如下图: 解决方法很简单,只能更改字体即可,步骤如下: 更改字体后,显示的结果如下:C&num;调用脚本语言(三)-- IronJS 与 IronLua 简单方法性能比较1. 测试环境 1.1. 硬件环境…

aix linux操作系统,AIX--操作系统安装(AIX 6.1)

前一段时间&#xff0c;胡哥我接到老板的任务&#xff0c;要在AIX系统上安装zabbix agent呀。可是胡哥只是玩过linux对于AIX这种需要硬件支持的才能玩的高端玩意可是从来没接触过呀&#xff0c;虽说linux是类unix&#xff0c;可是与unix系统还是有区别。有啥办法了&#xff0c;…

秋季学习总结

经过这个学期的学习让我对软件工程这个专业有了新的认识&#xff0c;从c语言的学习中&#xff0c;让我慢慢懂得了如何去编写一个程序&#xff0c;但是编写一个程序也并不是那么的容易。在这个学期的学期中我总是感觉容易忘记上一节课所讲的东西&#xff0c;这个是课后自己没花时…

permgen_打破PermGen神话

permgen在我的最新文章中&#xff0c;我解释了可能导致java.lang.OutOfMemoryError&#xff1a;PermGen空间崩溃的原因 。 现在该讨论该问题的可能解决方案了。 或更确切地说&#xff0c;是关于互联网对可能解决方案的建议。 不幸的是&#xff0c;我只能说&#xff0c;当我通过…