曾经有一段时间,至少在礼貌的社会中,人们普遍认为使用“ 不是 ”一词是不可接受的。 确实,那时(也许直到今天),许多人确实(也确实)认为不是一个真实的词。 尽管这个词并没有 引起争议,并且它的用法仍然经常被认为是不恰当的,但是它似乎正在慢慢地获得普遍认可,并且在使用频率方面也占有一席之地。 一次,“了解更多的人” 有意使用它来强调,但在受欢迎程度方面似乎正在慢慢获得。 在许多方面, 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在Inspired by Actual Events博客中获得。

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

Java是否越来越接受静态导入?相关推荐

  1. java静态导入_Java中越来越多地接受静态导入吗?

    java静态导入 曾经有一段时间,至少在礼貌的社会中,人们普遍认为使用" 不是 "一词是不可接受的. 确实,在那个时候(也许直到今天),很多人确实(也确实)不认为这不是一个真实的词 ...

  2. java中的导入gnu,【JAVA学习笔记】静态导入

    1.使用方法 package tips; public interface Constants { public static final int PORT_NUMBER = 90; public s ...

  3. Java的String.format可以静态导入

    JDK-8203630 ["为String :: format添加等效的实例方法"]假定"将String :: format实现为静态的参数似乎是可以静态导入 forma ...

  4. 提高你的Java代码质量吧:少用静态导入

    一.分析  从Java 5开始引入静态导入语法(import static),其目的是为了减少字符输入量,提高代码的可阅读性,以便更好地理解程序. 但是,滥用静态导入会使程序更难阅读,更难维护.静态导 ...

  5. Java 静态导入 、可变参数

    一. 静态导入 package com.tj.tedu.JDK5Test;import static java.util.Arrays.sort;//静态导入 , 表示只导入sort方法 并且只能导入 ...

  6. Day19(可变参数,增强for循环遍历,泛型通配符<?>,TreeSet,LinkedHashSet,集合的嵌套遍历,Set集合,静态导入,)

    一.可变参数 package com.shujia.lhw.day19;import java.util.Arrays; import java.util.List;/*可变参数概述:定义方法的时候不 ...

  7. 黑马程序员--高新技术--静态导入,基本数据类型拆箱与装箱,享元设计模式

    静态导入 import语句可以导入一个类或某个包中的所有类 import static语句导入一个类中的某个静态方法或所有静态方法或静态变量 使用静态导入可以使被导入类的静态变量和静态方法在当前类直接 ...

  8. (10)Java泛型-Map集合-集合框架工具类-可变参数-静态导入

    -- 部分1.5新特性Java泛型-Map集合-集合框架工具类 泛型 概述: JDK1.5版本以后出现的新特性,用于解决安全问题,是一个类型安全机制. 对于泛型可以这样理解: 没有使用泛型时,只要是对 ...

  9. java 16 -12 静态导入

    静态导入: 格式:import static 包名-.类名.方法名; 可以直接导入到方法的级别 静态导入的注意事项: A:方法必须是静态的 B:如果有多个同名的静态方法,容易不知道使用谁?这个时候要使 ...

最新文章

  1. Jmeter之完整的HTTP接口测试
  2. 30 万奖金悬赏 | CSDN 软件开发精英赛即日启动!
  3. LeetCode-剑指 Offer 22. 链表中倒数第k个节点
  4. 机器人瓦力 配乐_《WALL-E》机器人小王子
  5. 【视频教程】利用Excel轻松爬取网页上的数据
  6. 怎样写出简洁的css代码??★★★★
  7. ssh 协议 java_java代码之SSH协议连接linux
  8. 安装自己写的插件时,报插件版本过高,请升级JAR包或者安装低版本插件的问题
  9. 《极客与团队》一第二章 培养出色的团队文化
  10. 【原创】brew 和 brew cask
  11. javascrip对表格的操作(三)
  12. [转]mysql中int、bigint、smallint 和 tinyint的区别与长度的含义
  13. C语言中字符串转数字的方法
  14. C语言程序设计实验报告——实验六
  15. python非法的标识符_Python标识符
  16. java 实现 word 文档的在线编辑以及流转
  17. xd使用技巧_adobe xd高级技巧
  18. HTML+CSS零基础学习笔记(五)— 模拟淘宝首页(静态)
  19. 三维地质建模数据处理
  20. digest 词根 gest

热门文章

  1. inmemory_通过Spring Boot了解H2 InMemory数据库
  2. snmp与java集成_轻松地与Java完全集成
  3. java编写排序的代码_在Java 8之前,您编写了几行代码来对对象集合进行排序?...
  4. jpa映射json_如何使用JPA和Hibernate映射JSON集合
  5. 767 重构字符串_重构字符串型系统
  6. 某人想在h小时内钓到_为某人命名以重新连接到您的服务器
  7. 子模板继承父模板示例_模板设计模式示例
  8. java转换为c#_将25k行C#转换为Java的经验教训
  9. jax-ws和jax-rs_使用JAX-RS和Spring构建HATEOAS API
  10. Apache Camel 3 –骆驼核心vs骆驼核心引擎(较小的核心)