java静态导入

曾经有一段时间,至少在礼貌的社会中,人们普遍认为使用“ 不是 ”一词是不可接受的。 确实,在那个时候(也许直到今天),很多人确实(也确实)不认为这不是一个真实的词。 尽管这个词并没有 引起争议,并且它的用法仍然经常被认为是不恰当的,但是它似乎正在慢慢地获得普遍的接受,并在使用频率上占有一席之地。 一次,“了解更多的人” 有意使用它来强调,但在受欢迎程度方面似乎正在慢慢地得到普及。 在许多方面, J2SE 5引入的静态导入似乎与使用“不是”一词类似。

引用了《 J2SE 5编程语言指南 》中有关静态导入的部分(重点是原始内容的一部分):“那么,什么时候应该使用静态导入? 非常谨慎! ”部分的最后一段描述了何时最好使用静态导入:

那么什么时候应该使用静态导入? 非常谨慎! 仅当您打算以其他方式声明常量的本地副本或滥用继承( Constant Interface Antipattern )时,才使用它。 换句话说,当您需要频繁访问一两个类的静态成员时,请使用它。 如果您过度使用静态导入功能,它将使您的程序无法读取和不可维护,并使用您导入的所有静态成员污染其名称空间。 代码的读者(包括您,在您编写代码后的几个月内)不会知道静态成员来自哪个类。 从类中导入所有静态成员可能对可读性特别有害; 如果只需要一个或两个成员,则分别导入它们。 通过适当地使用,静态导入可以消除类名重复的样板,从而使您的程序更具可读性。

就像“不是”一词一样,受过良好教育的Java开发人员似乎几乎普遍同意应尽量少使用静态导入。 这里的理由很明显。 首先,官方文件是这样说的。 其次,更重要的是,毫无疑问,过度使用静态导入实际上可能导致可读性差的代码,即使它更简洁。 实际上,过多的静态导入可能会导致冲突 ,从而导致大量使用静态导入的能力丧失。 尽管已经意识到并承认了静态导入的弊端和潜在滥用,但是Java社区似乎越来越多地使用它。

在编写简单的示例来说明要点时(例如本博客中的帖子),我经常不用理会日志记录框架,而是简单地使用System.out和System.err 。 我不介意假设我的代码中对out任何引用均指标准输出的句柄,而对err任何引用均指标准错误的句柄。 我不打算在任何其他情况下使用outerr ,因此这为简单的代码带来了简洁性,而又不会降低可读性或增加歧义。 这也很像Groovy的写标准输出的方法(尽管不那么简洁)。 您可以在Java静态导入中找到有关此方法的更多详细信息:System.out和err ,在我的文章Static Imports和System.out中 ,以及在Cay Horstmann的文章中, 您正在使用静态导入吗?

在Java世界中,也许甚至更普遍地使用静态导入以单元测试的名义出现。 几个最流行的面向Java的单元测试框架都鼓励使用静态导入来实现更流畅的测试代码。 JUnit的的断言方法 , 的Mockito的的Mockito方法 ,以及Hamcrest的匹配器是一些静态导入的使用在Java单元测试世界流行的最明显的例子。

在《 我不喜欢Java的静态导入》一文中 ,Mark Needham描述了一种情况,我认为许多Java开发商店都在涉及静态导入时遇到了这种情况:

在我的上一个项目中,我们最后说在测试代码中允许导入static,因为可以从中导入static方法的地方相对较少,但是当涉及生产代码时,则需要完全限定的路径。

甚至在测试代码中使用静态导入也不是没有问题或争议的。 查找Mockito构造的导入静态语句的StackOverflow线程讨论与使用静态导入相关的一些挫败感。 Needham也解决了这个问题 :

这种方法的优点是使代码阅读更流畅,但缺点是您无法立即知道方法的位置。 我希望能够通过查看它来告诉代码中发生了什么,以及防止这一切的任何障碍。

到目前为止,我已经研究了Java静态导入与java.lang.System.out调用以及单元测试的结合使用。 这两种情况都不是典型的生产代码案例(在生产中,使用日志记录框架进行日志记录要比标准输出更好,并且单元测试不是生产代码 ,尽管它们可能随其一起提供)。

哪个用于生产代码的Java框架鼓励使用静态导入可能不太明显。 一个例子是lambdaj 。 lambdaj功能 Wiki页面通过建议使用静态导入开始: 在Lambda类中,所有这些功能均作为静态方法提供,因此,使用它们的最佳方法是添加以下导入:

import static ch.lambdaj.Lambda.*;

在您要使用它的类中。

更一般的情况下,使用的Java使用静态导入的是发展的领域特定语言 ( DSL在S) 的Java 。 在许多方面,已经在本文中针对JUnit,Mockito,Hamcrest和Lambdaj讨论过的静态导入的使用是这种更趋向于流畅接口和DSL的普遍趋势的具体示例。

出于充分的理由,我相信大多数Java开发人员对于过度使用和滥用静态导入都持谨慎态度。 但是,在适当情况下更多地使用静态导入似乎是玩弄这些静态输入并了解它们的正面和负面结果的结果。 JVM脚本语言和其他更简洁(较少仪式)的语言的兴起也可能影响了有关使用静态导入的一般思考 。

流利的接口(静态导入的正作用)的驱动器必须与使用静态导入相关的维护和可读性成本进行比较。 总的来说,正如我认为“不是”仍然被人们所皱眉,但也许不像以前那样被皱眉,我也认为仍然不鼓励静态导入,但是作为Java社区的我们也许已经开始了看看他们可能还可以,甚至值得付出代价的积极功能。 我认为没有人认为经常使用它们而不考虑使用它们的上下文是一个好主意。

参考: Java中越来越多地接受静态导入吗? 由我们的JCG合作伙伴 Dustin Marx在“ 实际事件启发”博客中获得。

翻译自: https://www.javacodegeeks.com/2012/04/are-static-imports-becoming.html

java静态导入

java静态导入_Java中越来越多地接受静态导入吗?相关推荐

  1. java 静态类实例_Java中多个类的静态实例?

    我是新的请不要介意,如果你发现问题愚蠢.我正在搞乱单身代码.我改变了一点(我的问题与单身无关,是的我已经删除了单实例检查).我的问题是虽然java中的类实例只能是一个为什么输出中有两个静态类" ...

  2. java静态局部变量_java中成员变量,局部变量,静态变量的辨析

    转自百度:https://baijiahao.baidu.com/s?id=1625360816541592483&wfr=spider&for=pc 1.java中成员变量,局部变量 ...

  3. @value 静态变量_Java中的变量——通过示例学习Java编程(4)

    作者:CHAITANYA SINGH 来源: 通过示例学习Java编程(4):Java中的变量-方家话题​www.koofun.com 变量是用来存放可以更改的值的容器.例如,当我写int i = 1 ...

  4. java静态代码块和静态变量_Java中的静态变量、静态方法与静态代码块

    我们知道类的生命周期分为装载.连接.初始化.使用和卸载的五个过程. 其中静态代码在类的初始化阶段被初始化.而非静态代码则在类的使用阶段(也就是实例化一个类的时候)才会被初始化. 静态变量 可以将静态变 ...

  5. java键盘输入字符串静态变量_Java 中为什么样在静态方法中可以调用的方法、可以使用的成员变量必须是静态的?老师说字符串常量和静态变量放在data segment中...

    在上一篇文章中,小编为您详细介绍了关于<C字符串以'\0'结尾的问题?为什么样C语言字符串常量可以当做指针>相关知识.本篇中小编将再为您讲解标题Java 中为什么样在静态方法中可以调用的方 ...

  6. java静态初始化块的作用_Java 中的 static 使用之静态初始化块

    方法不在main函数里面不会被执行吗? public class HelloWorld { String name; // 声明变量name String sex; // 声明变量sex static ...

  7. java static用法_Java中static关键字的作用和用法详细介绍

    static表示"全局"或者"静态"的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念. 被static ...

  8. java this用法_java中this用法小结

    Java关键字this只能用于方法方法体内.当一个对象创建后,Java虚拟机(JVM)就会给这个对象分配一个引用自身的指针,这个指针的名字就是this.因此,this只能在类中的非静态方法中使用,静态 ...

  9. java 序列化实例_Java中的序列化与反序列化实例

    创建的字节流与平台无关.因此,在一个平台上序列化的对象可以在另一个平台上反序列化. 为了使Java对象可序列化,我们实现java.io.Serializable可序列化接口. ObjectOutput ...

最新文章

  1. VC提前注入.net软件的方法
  2. OSPF有五种报文,hello,dd,lsr,lsu,lsack
  3. javax消息队列_java实现消息队列的两种方式(小结)
  4. linux编程基础_第1篇 Linux系统编程 -多线程基础
  5. NYOJ 士兵杀敌(四) 树状数组
  6. tensorflow gpu windows配置步骤教学
  7. Python正则表达式如何进行字符串替换
  8. Python Tricks(二)—— 牛顿法求解平方根(最大整数)
  9. POJ 1330 Nearest Common Ancestors(LCA Tarjan算法)
  10. matlab2016数模a,2016年全国数学建模竞赛A题国家一等奖.pdf
  11. 计算机二级栈,计算机二级国考office的高科技玩法之:堆栈的续集
  12. UE4打开屏幕键盘/软键盘/虚拟键盘 无法输入中文
  13. 在java中获取全年的节假日(包含周末和法定节假日及调休日)
  14. 条件概率和正则概率(完)
  15. 七层网络协议模型(ISO模型)
  16. Android安卓原生实现微信登陆
  17. 三大运营商5G套餐出炉:有什么区别呢?
  18. RK3568平台开发系列讲解(音视频篇)AudioTrack音频流数据传输
  19. java计算机毕业设计库存管理系统源码+系统+数据库+lw文档+mybatis+运行部署
  20. 374 猜数字大小

热门文章

  1. MySQL 调优/优化的 101 个建议!
  2. 青鸟IT汇微信公众号新增智能机器人
  3. Oracle数据库基本概念理解(1)
  4. 字段缺失_区分Protobuf 3中缺失值和默认值
  5. 使用navicat 复制 数据库 使用mysql5.7 utf8mb4 utf8mb4_general_ci 爬虫的时候就支持表情包了
  6. elementui下拉框选择图片_element ui下拉框如何实现默认选择?
  7. 转:SparkConf 配置的用法
  8. java-jar jvm_使用Java流和In-JVM-Memory的超低延迟查询
  9. 对话框 函数_通过函数式编程实现动态对话框处理程序
  10. mysql查询会话池_用户会话,数据控件和AM池