Java 9:好的,坏的和私有的接口方法

Java 9 是在几周前发布的。 查看发行说明 ,其中包含许多有趣的功能。 不过,我觉得并非一切都是不如甲骨文和Java行家似乎图片吧 。 我看到了Java世界中的三个趋势,分别是好,坏和丑陋。 让我们从好的开始。

Birdman(2014),作者:Alejandro G.Iñárritu

该平台

第一个趋势是对编译Java,打包JAR和运行字节码的平台的明显改进。 每个Java新发行版肯定会变得更好。 以下是Java 9所做的改进,毫无疑问,它们非常有用:

  • JSR 376 :模块系统又名拼图
  • JEP 222 : jshell
  • JEP 238 :多发行版JAR
  • JEP 282 : jlink
  • JEP 158 :统一日志记录

该平台显然正在变得更加成熟。 这是一个趋势。

JDK

自Java 6以来我观察到的第二个趋势表明,JDK本质上​​是由Oracle设计,开发和维护的类和接口的集合,每发布一个新版本,JDK就会变得越来越大。 在Java 9中,除了其他功能外,它们还添加和扩展了以下内容:

  • JEP 221 , 224 225 , 261 :的Javadoc处理(扩展)
  • JEP 268 :XML目录(新)
  • JEP 262 :TIFF映像I / O(新)
  • JEP 251 :多分辨率图像(新)
  • JEP 110 :HTTP 2.0客户端(新)
  • JEP 236 :Nashorn解析器(扩展)

当然,某些功能必须在JDK本身中实现,例如Unicode支持( JEP 267 ),特定于平台的桌面功能( JEP 272 ),Spin-Wait提示( JEP 285 ),紧凑字符串( JEP 254 )和流程API。 ( JEP 102 )。 它们的实现取决于基础平台,并且必须与JVM一起提供。

但是在JDK中,HTTP 2.0客户端与JAX-RS , JPA , JAX-WS , JDBC以及许多其他我认为应该远离Oracle的事物在做什么? 它们不是特定于平台的,可以由开源社区以更好的方式将它们设计为独立的软件包。 我认为,将它们汇总在一个巨型保护伞品牌下是一个错误。

我认为,大公司只是在扼杀软件市场,而没有使它变得更好,这是因为它们暴露于其财务和政治动机。 这正是JDK发生的事情。 由于甲骨文的垄断,它缺乏增长的灵活性和动态性。 换句话说,我们对Oracle及其大朋友认为正确的事情一无所知。

因此,使JDK更大是一个趋势。 相反,我相信,Oracle只会从缩小规模中受益,将所有非特定于平台的内容委派给开源社区,以某种方式支持程序员,并促进市场上开放有效的标准化流程。

语言

Java由James Gosling在1995年的Sun Microsystems中开发,是一种面向对象的语言。 关于这种面向对象的主张引起了很多关注 ,我也不确定Java是否比过程更面向对象。 但是,它是官方的面向对象的。

从Java的第一个版本开始,Java就从C / C ++继承了许多程序特性,包括静态方法 , NULL , 实现继承等。据我所知,它不是一种完美的面向对象语言,也不会成为一种语言。它。 关键思想是创建可以一次编写并可以在任何地方运行的东西。 但是,该语言也很重要,而不仅仅是JVM。 简单又性感。

Java 5在2004年向前迈出了重要的一步,并通过添加泛型 ,for-each循环, varargs和静态导入对语言进行了改进。 但是,引入了注释和枚举,这有助于该语言从对象范式转移到完全不同的过程。

Java 7在2011年增加了try-with-resource ,这是一个很好的举措,与OOP范例保持一致。

Java 8在2014年添加了lambda表达式 ,这是一个很棒的功能,但与OOP绝对无关。 Lambda和Streams API将Java变成了对象,过程和功能范式的混合体。 默认方法也已添加到接口,从而将类型转换为代码库。 输入库! 如果您问我,它甚至比实现继承更糟糕。

现在,Java 9对接口进行了下一个“改进”,使它们可以使用私有方法。 类型中的私有静态方法! 你相信吗? 下一步将是什么? 我猜是Java 10中的属性。

另外,让我们看一下对JDK中的某些核心类所做的操作,以了解该语言的发展方向。 仅举两个例子。

收集的工厂方法 ( JEP 269 )。 而不是引入新的构造函数并允许我们这样做:

 List<Integer> list = new ArrayList<>( 1 , 2 , 3 ); 

…在Java 9中,他们创建了更多的静态方法并使我们这样做:

 List<Integer> list = List.of( 1 , 2 , 3 ); 

“更少的构造函数,更多的静态方法!” 似乎是那些介绍此JEP的人的哲学。 不用说,这完全违背了面向对象编程的精神。 无论Joshua Bloch 说什么,都必须由构造函数创建对象,而不是静态方法。 静态方法使我们看不到操作符new用法的时刻,这就是代码难以维护的原因-我们只是不知道确切地实例化了哪个类以及其ctor的实际参数是什么。

顺便说一下,使用Cactoos,您可以正确地做到这一点:

 List<Integer> list = new ListOf( 1 , 2 , 3 ); 

这是OOP。

InputStream新方法 。 在已经过大的类InputStream中添加了三个新方法: transferTo()readNBytes()readAllBytes() 。 现在,当我们想将输入流复制到输出流时,我们应该这样做:

 input.transferTo(output); 

这是年轻的OOP程序员犯的最典型的错误之一:他们使接口变大。 只是因为他们需要更多功能。 我猜想接口隔离原则是著名的SOLID的一部分,并且已经使用了很多年。 Oracle,您怎么了? 下一步将是什么? 在Java 10中,我们还将具有saveToFile()printToConsole()吗? 怎么样emailToAFriend()

这就是您将如何使用commons-io的IOUtils实用程序类执行以下操作:

 IOUtils.copy(input, output); 

这不是完美的 ,但是更好。 最面向对象的方法是使用对象,而不是实用程序类和静态方法。 这就是Cactoos中的工作方式 :

 new LengthOf( new TeeInput(input, output)).length(); 

这是OOP。

我认为Java越来越难看 ,这是一种趋势。 这是否意味着该退出了? 没有! 无论您多么丑陋,我们将永远爱您Java!

您可能还会发现这些相关的帖子很有趣: 每个私有静态方法都是新类的候选人 ; 灵活性等同于低质量 ; 为什么InputStream设计错误 ; 继承是一种代码重用的程序技术 ; 方法调用之间的时间耦合 ;

翻译自: https://www.javacodegeeks.com/2017/10/java-9-good-bad-private-interface-methods.html

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

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

相关文章

newton迭代法求近似值matlab,Newton迭代法求函数极小值点 Matlab程序

clear allclc%Newton迭代法求解极小值点%090311%%定义函数disp 函数 f(x) 为:syms x1 x2f(x1-2)^4(x1-2)^2*x2^2(x21)^2disp 初始点的值&#xff1a;x0[1;1]%%求函数的梯度和海色阵disp 函数f的梯度&#xff1a;gjacobian(f,[x1;x2])disp 函数f的Hesse矩阵&#xff1a;Gjacobia…

php如何写log日志,用php生成log日志

楼盘列表$(function() {//获取网址参数var url document.URL;var urlArr url.split(“/”);var urlUseArr urlArr[3].split(“?”);var urlPamArr urlUseArr[1].split(“&”);var urlReset ”;for (var i 0; i < urlPamArr.length; i) {var urlPamSigleArr urlP…

php 之 ajax,PHP之AJAX

一.AJAX Asynchronous JavaScript And XML(异步 JavaScript 及 XML)二.PHP 和 AJAX不存在什么 AJAX 服务器。AJAX 是一种在浏览器运行的技术。它使用浏览器与 web 服务器之间的异步数据传输&#xff0c;使网页从服务器请求少量的信息&#xff0c;而不是整张页面。AJAX 是一种独…

lambda表达式方法泛型_模板方法模式–使用Lambda表达式,默认方法

lambda表达式方法泛型模板方法模式是Erich Gamma&#xff0c;Richard Helm&#xff0c;Ralph Johnson和John Vlissides在著名的《 设计模式》一书中解释的23种设计模式之一。 这种模式的意图表示为&#xff1a; 在操作中定义算法的框架&#xff0c;将某些步骤推迟到子类。 Tem…

java报错找不到对象,使用Spring源码报错java:找不到类 InstrumentationSavingAgent的问题...

使用Spring源码&#xff0c;报错java:找不到类 InstrumentationSavingAgent报错如下&#xff1a;Error:(26, 38) java: 找不到符号符号: 类 InstrumentationSavingAgent位置: 程序包 org.springframework.instrument解决办法&#xff1a;在自己测试项目的build.gradle里加上 co…

PagingAndSortingRepository –如何与Thymeleaf一起使用

在本教程中&#xff0c;我将演示如何通过分页显示Thymeleaf中的企业客户列表。 1 –项目结构 我们有一个正常的Maven项目结构。 2 –项目依赖性 除了正常的Spring依赖关系之外&#xff0c;我们还添加Thymeleaf和hsqldb&#xff0c;因为我们使用的是嵌入式数据库。 <?x…

php 如何股票曲线图,如何看股票曲线图?股票曲线图讲解

如何看股票曲线图&#xff1f;股票曲线图讲解股票分时图走势图表&#xff1a;乳白色曲线图表明这种个股的分时图交易量价钱。淡黄色曲线图表明这种个股的均价。淡黄色柱线表明每分的交易量&#xff0c;企业为手(100股/手)。下边是分时图走势图表中经常会出现的专有名词及寓意&a…

matlab里方差分析的盒子图怎么看,Matlab方差分析

Matlab 方差分析(T检验)在工农业生产和科学研究中,经常遇到这样的问题:影响产品产量、质量的因素很多,我们需要了解在这众多的因素中,哪些因素对影响产品产量、质量有显著影响.为此,要先做试验,然后对测试的结果进行分析.方差分析就是分析测试结果的一种方法.在方差分析中,把在…

java集合提取最小的日期_提取Java集合的元素-Java 8方法

java集合提取最小的日期我们都广泛使用了Collection类&#xff0c;例如List&#xff0c;Map及其派生版本。 每次使用它们时&#xff0c;我们都必须遍历它们以找到某个元素或更新这些元素&#xff0c;或者找到匹配某个条件的不同元素。 考虑如下所示的人员列表&#xff1a; Lis…

php中的空转为什么意思,php 长期更

php 语法&#xff1a;换行&#xff1a;echo"";echo;"."会连接字符串123.456""等号只判断左右两边的最终结果&#xff0c;而不判断数据类型。""全等于首先判断两边的数据类型是否一致&#xff0c;接着判断最终结果是否一致。“||”“|”…

apache 隐藏php版本,PHP+Apache环境中怎么隐藏Apache版本

PHPApache环境中怎么隐藏Apache版本发布时间&#xff1a;2021-02-08 09:57:43来源&#xff1a;亿速云阅读&#xff1a;104作者&#xff1a;小新小编给大家分享一下PHPApache环境中怎么隐藏Apache版本&#xff0c;相信大部分人都还不怎么了解&#xff0c;因此分享这篇文章给大家…

使用Okta的单点登录保护您的Vert.x服务器

“我喜欢编写身份验证和授权代码。” 〜从来没有Java开发人员。 厌倦了一次又一次地建立相同的登录屏幕&#xff1f; 尝试使用Okta API进行托管身份验证&#xff0c;授权和多因素身份验证。 Vert.x是Spring生态系统中增长最快的元素之一&#xff0c;保护Vert.x服务器可能是一个…

cas java web,CAS干单点登陆(SSO)——集成Java Web 项目

在应用WEB-INF/web.xml添加filter的内容&#xff0c;效果如下所示org.jasig.cas.client.session.SingleSignOutHttpSessionListenerCAS Single Sign Out Filterorg.jasig.cas.client.session.SingleSignOutFilterCAS Single Sign Out Filter/*CASFilterorg.jasig.cas.client.au…

oracle的dtime,Oracle时间函数

YYYY年 Q季度MM月 month月WW当年第几周 W本月第几周DDD 当年第几天 DD当月第几天 D当周内第几天 DY当周内星期几 day当周内星期几HH或HH12:12进制小时数 HH24:24小时制MI:分钟数(0&#xff5e;59) SS:秒数(0&#xff5e;59)1、Sysdate:当前日期和时间Select sysdate from dual2…

Apache Kafka简介

什么是Apache Kafka&#xff1f; Apache Kafka是一个分布式流系统&#xff0c;具有发布和订阅记录流的功能。 在另一方面&#xff0c;它是企业消息传递系统。 它是一个快速&#xff0c;水平可扩展和容错的系统。 Kafka有四个核心API&#xff0c; 生产者API&#xff1a; 该API允…

oracle查看存储过程最近编译,Oracle恢复被误编译覆盖的存储过程

同事在写Oracle存储过程时候&#xff0c;是在以前已经写好的过程基础上修改的&#xff0c;想换个名字&#xff0c;由于疏忽没有改名字就编译了&#xff0c;编译完才意识到。这时原来的那个已经没有了。找我想办法恢复回原来的那个过程。通过查资料想到个方法&#xff0c;也不知…

oracle安装 redo log file,Oracle Dump Redo Log File 说明

关于Dump redo log 的示例&#xff0c;MOS 上的文档&#xff1a;[ID 1031381.6] 有详细说明。Dump 有两种方式&#xff1a;(1)使用一. dump redo 说明关于Dump redo log 的示例&#xff0c;MOS 上的文档&#xff1a;[ID 1031381.6] 有详细说明。Dump 有两种方式&#xff1a;(1)…

unity 飞机 残骸模型_训练残骸模式– Java 8中的改进实现

unity 飞机 残骸模型Venkat Subramaniam在今天的演讲中提到了有关“级联方法”模式或“火车残骸”模式的内容&#xff0c;如下所示&#xff1a; >someObject.method1().method2().method3().finalResult()很少有人会将此与构建器模式相关联&#xff0c;但事实并非如此。 无…

datastage配置oracle,IBM Datastage8.5配置问题

大家好&#xff0c;最近因学习需要&#xff0c;在虚拟机REHL5.5上安装了IBM Datastage8.5的服务器端&#xff0c;在windows端安装客户端&#xff0c;调试连接时&#xff0c;提示密码不正确&#xff0c;我修改了密码&#xff0c;重启了服务器&#xff0c;还是提示密码不正确&…

JSON模式在构建和部署API中的作用

什么是JSON模式 &#xff1f; 它提供了描述任何JSON值的结构和属性的详尽方法。 在记录对任何JSON API的请求和响应时&#xff0c;它非常有用。 本文将探讨其在API的软件开发周期中的作用。 记录JSON响应格式 定义数据架构的最明显的用例也许是在记录API响应的结构。 让我们来…