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

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静态导入

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

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

相关文章

Vue+ECharts的小示例

VueECharts做数据可视化1. Vue Vue 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现…

将MongoDB集成到您的Spring项目

本文展示了如何通过注释配置将MongoDB集成到您的spring项目中。 我们将从Gradle配置开始。 group com.gkatzioura.spring version 1.0-SNAPSHOTbuildscript {repositories {mavenCentral()}dependencies {classpath("org.springframework.boot:spring-boot-gradle-plugi…

汇编学习笔记(3)-80x86指令集

前言 (1)指令的一般格式 [标号:] 助记符 [操作数1 , [操作数2]] [; 注释] 一行一条指令 助记符就是指令的名称,每条指定必定有个助记符。 助记符前面的标号是给汇编编译器看的,由我们自己取名,一般取表示本…

osg 三维gis开发_三维GIS平台的可视化应用 (下)

上一篇主要对三维GIS的基础数据和三维模型进行了一点说明,本篇将接着聊剩下的部分,主要是三维GIS平台能够支持什么样的场景展示,并来对平台的应用进行一些介绍。没看过上篇的朋友可以先了解一下再看本篇:MonoLog:三维G…

Servlet拦截器

Servlet拦截器1.LoginFilter package main.java.filter;import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.IOException;public class LoginFi…

前端HTML介绍

一、HTML简介HTML定义:  超级文本标记语言是标准通用标记语言下的一个应用,也是一种规范,一种标准,它通过标记符号来标记要显示的网页中的各个部分。网页文件本身是一种文本文件,通过在文本文件中添加标记符&#xff…

huffman编码的程序流程图_Huffman编码实现压缩解压缩

这是我们的课程中布置的作业。找一些资料将作业完毕,顺便将其写到博客,以后看起来也方便。原理介绍什么是Huffman压缩Huffman( 哈夫曼 ) 算法在上世纪五十年代初提出来了,它是一种无损压缩方法,在压缩过程中不会丢失信息熵。并且能…

solr创建索引_Solr:创建拼写检查器

solr创建索引在上一篇文章中,我谈到了Solr Spellchecker的工作原理,然后向您展示了其性能的一些测试结果。 现在,我们将看到另一种拼写检查方法。 与其他方法一样,此方法使用两步过程。 相当快速的“候选单词”选择,然…

5000元性价比高的笔记本_2018性价比笔记本电脑品牌推荐 5000左右笔记本性价比推荐...

对于年年都出新款的电子产品,购买者们每年都经历一回挑花眼的时刻,那2018有什么笔记本比较好呢?宏碁暗影骑士3参考价:5099元内存容量:8G  显存容量:2G  硬盘容量:128G1T显卡型号:GTX1050(高…

Hibernate模糊查询

Hibernate模糊查询1.不使用hql DetachedCriteria criteria DetachedCriteria.forClass(User.class);if (StringUtils.isNotEmpty(yh)) {criteria.add(Restrictions.or(Restrictions.eq("yhid", yh),Restrictions.like("yhxm", yh, MatchMode.ANYWHERE)))…

带有Javaslang的Java 8中的功能数据结构

Java 8的lambda(λ)使我们能够创建出色的API。 它们令人难以置信地提高了语言的表达能力。 Javaslang利用lambda来基于功能模式创建各种新功能。 其中之一是功能性集合库,旨在替代Java的标准集合。 (这只是鸟瞰图,您…

丰田pcs可以关闭吗_丰田车必备的配置有哪些是在亚洲龙上体现了?

亚洲龙基于丰田TNGA架构下的GA-K平台打造而来,与雷克萨斯ES一致,先期推出搭载2.5L自然吸气发动机以及2.5L混合系统的车型。作为一汽丰田的全新旗舰轿车,亚洲龙主销车型配备丰田TSS规避碰撞辅助套装,英文全拼为 “Toyota Safety Se…

[NOIP2014]飞扬的小鸟

思路{ 对于每一列,小鸟或下落,或上升。那我们很容易想到对应的背包问题! 按照完全背包的思想更新上升部分,01背包的方法更新下降部分。 撞到柱子了(aluba。。。。。。aluba.。。。。。)不慌,只需把它设为不可打即可&am…

2020 dns排名_2020年新版全球/全国各地ISP的DNS服务器地址表

【第一】国内外知名的公共DNS服务器(排列不分先后):腾讯公共DNS(119.29.29.29、182.254.116.116)阿里公共DNS(223.5.5.5、223.6.6.6)百度公共DNS(180.76.76.76)360安全DNS(123.125.81.6)Google(8.8.8.8、8.8.4.4)114DNS(114.114.114.114、114.114.115.115)OpenDNS(2…

Spring MVC 登录拦截器

Spring MVC 登录拦截器1.编写拦截器 package interceptor;import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRespons…

bzoj1556 (DP)

bzoj 1556 点这里打开题目 题目是求 a^2 求和; 原问题可以转化为:两个人在玩这个东西,问这两个人弄出来的序列相同的有多少种情况,操作方式不同即为一种不同的情况。 就这个问题,参考大佬的DP思想。 DP[t][i][j] 分别…

帆软参数设置_数据分析软件之FineReport教程:[5]参数界面JS(全)

在用报表工具设计报表时,使用参数控件时,有时我们希望部分参数控件在没满足条件时不显示,满足条件后再显示,接下来我就来教教大家怎么做!表格软件如何根据条件控制参数控件是否显示一:问题描述在使用参数控…

wurfl_比较OpenDDR与WURFL

wurfl量身定制的Web内容通常受益于定制,以考虑多种因素,例如屏幕大小,标记语言支持和图像格式支持。 此类信息存储在“设备描述存储库”(DDR)中。 WURFL和OpenDDR项目都提供了访问DDR的API,以简化并促进适应…

ssm 静态资源处理器

ssm 静态资源处理器<!-- 静态资源处理--><mvc:default-servlet-handler/>

极简单的方式序列化sqlalchemy结果集为JSON

继承 json.JSONEncoder 实现一个针对sqlalchemy返回类型的处理方式。 sqlalchemy的返回类型有大都有两种&#xff0c;一种是Model对象&#xff0c;一种是Query集合&#xff08;只查询部分字段&#xff09;。 针对这两种返回结果&#xff0c;都是来自同一中类型 sqlalchemy.orm…