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

java 接口 私有

Java 9 是在几周前发布的。 查看发行说明 ,其中包含许多有趣的功能。 不过,我觉得并非一切都是不如Oracle和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的垄断,它缺乏增长的灵活性和动态性。 换句话说,我们对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

java 接口 私有

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

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

相关文章

java群面自我介绍,腾讯群面,自我介绍很重要

我面试时间是十一点&#xff0c;但是一直等到十二点多才开始&#xff0c;去了以后先要填一张表&#xff0c;贴照片&#xff0c;内容差不多就是我们自己简历上的&#xff0c;然后再群面的时候交给面试官。我们那个小组是六个人&#xff0c;在一个房间里&#xff0c;面试官先让我…

python卸载module_Python学习笔记

拖了一整年终于开始学习Python编程。为了逼自己快速上路&#xff0c;强行要求自己本学期的两门课程全部的coding作业用Python完成。 一门机器学习&#xff08;computational Stats&#xff09;&#xff0c;一门Jeff WU 大佬的实验设计与分析&#xff08;DOE&#xff09;。即使R…

Linux 命令之 uname -- 显示系统/主机的相关信息

文章目录一、命令介绍二、常用选项三、命令示例&#xff08;一&#xff09;显示系统主机名、内核版本号、CPU类型等信息一、命令介绍 uname 命令的英文全称即“Unix name”。用于显示系统相关信息&#xff0c;比如主机名、内核版本号、硬件架构等。如果未指定任何选项&#xf…

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

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

java 中允许键重复的,二叉搜索树的定义是否允许重复键?

许多算法将指定排除重复项 . 例如&#xff0c;MIT算法书中的示例算法通常提供没有重复的示例 . 实现重复(在节点上或在一个特定方向上作为列表)是相当简单的 . )大多数(我见过)将左边的孩子指定为<&#xff0c;将右边的孩子指定为> . 实际上&#xff0c;允许右子节点或左…

mlp神经网络_白天鹅黑天鹅灰天鹅?卷积神经网络帮你搞定识别

全文共3014字&#xff0c;预计学习时长6分钟本文将通过一系列的天鹅图片来解释卷积神经网络&#xff08;CNN&#xff09;的概念&#xff0c;并使用CNN在常规多层感知器神经网络上处理图像。图像分析假设我们要创建一个能够识别图像中的天鹅的神经网络模型。天鹅具有某些特征&am…

Linux 关机/关闭主机/关闭系统/重启系统/注销系统的命令

文章目录一、shutdown二、reboot三、init四、halt五、poweroff六、logout七、systemctl八、Alt PrtSc (SysRq) REISUB九、molly-guard&#xff08;一&#xff09;molly-gurar 是什么&#xff1f;&#xff08;二&#xff09;如何安装 molly guard?一、shutdown 该命令用于断…

java登录界面命令_Java命令行界面(第26部分):CmdOption

java登录界面命令由于Tweet&#xff0c;我了解了本系列中第26个基于Java的功能强大的库&#xff0c;该库用于解析命令行参数 。 CmdOption在其GitHub主页上被描述为“一个通过注释配置的&#xff0c;用于Java 5应用程序的简单注释驱动命令行解析器工具包。” 该项目的副标题是“…

matlab如何添加度,matlab里的模糊工具箱绘制隶属度函数曲线导入到word的方法

在fuzzy logic toolbox里有 fuzzy membershipfunction可以编辑隶属度函数&#xff0c;非常方便&#xff0c;但是我们写论文一般要把相应的曲线导入到word里&#xff0c;怎样将隶属度函数曲线导入到word里呢&#xff1f;本人也苦苦的寻找了好久。。。方法如下&#xff1a;先看看…

pythonista3使用说明_Pythonista中文文档:sound

sound — 音效和音乐播放 sound模块包含在iOS上播放音效和音频文件的功能。 它还可以使用Recorder类从麦克风录制音频文件。 注意: 为了使用Recorder类&#xff0c;你必须允许访问麦克风。首次使用Recorder.record()方法时&#xff0c;系统会自动显示一个对话框。如果你未授权访…

Linux 命令之 hostnamectl -- 查看/修改当前主机的信息

文章目录命令介绍常用选项命令示例&#xff08;一&#xff09;查看当前主机的信息&#xff08;二&#xff09;设置当前主机的名称命令介绍 hostnamectl 可用于查询和更改系统主机名和相关设置。此工具区分三种不同的主机名&#xff1a; 高级“漂亮”主机名&#xff0c;其中可…

getopt java_Java命令行界面(第28部分):getopt4j

getopt javagetopt4j的页面将其描述为“一个根据GNU样式解析命令行参数的库。” 然后&#xff0c; 页面介绍getopt4j &#xff1a;“getopt4j库旨在以与glibc &#xff08;GNU C运行时库&#xff09;中的C getopt&#xff08;&#xff09;函数相同的方式解析命令行选项。 与原始…

matlab 返回变量类型的命令,MATLAB主要命令汇总

MATLAB主要命令汇总1、常用信息help:在线帮助(显示在命令窗)。helpwin:在线帮助(独立窗口显示)。ver:MATLAB及工具箱的版本信息。2、管理工作区命令who:显示当前变量。whos:显示当前变量具体信息。clear:从内存中清楚变量和函数。quit:退出MATLAB。3、管理命令和函数what:显示当…

springboot redis token_Spring Boot + Redis + 注解 + 拦截器来实现接口幂等性校验

优质文章&#xff0c;及时送达作者 | wangzaiplus链接 | www.jianshu.com/p/6189275403ed一、概念幂等性, 通俗的说就是一个接口, 多次发起同一个请求, 必须保证操作只能执行一次比如:订单接口, 不能多次创建订单支付接口, 重复支付同一笔订单只能扣一次钱支付宝回调接口, 可能…

语言代号/地区代号/国家代号

国家/地区语言代码简体中文(中国)zh-cn繁体中文(台湾地区)zh-tw繁体中文(香港)zh-hk英语(香港)en-hk英语(美国)en-us英语(英国)en-gb英语(全球)en-ww英语(加拿大)en-ca英语(澳大利亚)en-au英语(爱尔兰)en-ie英语(芬兰)en-fi芬兰语(芬兰)fi-fi英语(丹麦)en-dk丹麦语(丹麦)da-dk英…

java 示例_功能Java示例 第2部分–讲故事

java 示例这是称为“ Functional Java by Example”的系列文章的第2部分。 我在本系列的每个部分中开发的示例是某种“提要处理程序”&#xff0c;用于处理文档。 在上一部分中&#xff0c;我从一些原始代码开始&#xff0c;并应用了一些重构来描述“什么”而不是“如何”。 …

python如何读取文件内容求和_使用python对文件中的数值进行累加的实例

问题描述&#xff1a; 一个文件由若干条记录组成&#xff0c;记录的格式为&#xff1a;“num1 num2”&#xff0c;有时候&#xff0c;需要统计文件中num1对应的num2的总值。 处理问题的思路 用传说中的python来处理&#xff0c;很方便。几行代码就可以了。 处理思路&#xff1a…

基2FFT算法matlab程序编写,频率抽取(DIF)基2FFT算法的MATLAB实现

频率抽取(DIF)基2FFT算法和时间抽取(DIT)基2FFT算法是两种等价的FFT算法&#xff0c;其相同之处&#xff1a;(1)DIF与DIT两种算法均为原位运算。(2)DIF与DIT运算量相同。不同之处&#xff1a;(1)DIF的算法结构是将DIT算法结构倒过来。 DIF为输入顺序&#xff0c;输出乱序。运算…

Linux 命令之 localectl -- 控制系统的本地化与键盘布局

文章目录命令介绍常用选项参考示例&#xff08;一&#xff09;显示当前的本地化设置与键盘映射&#xff08;二&#xff09;设置系统的本地化字符集环境变量&#xff08;三&#xff09;列出本地所有字符集&#xff08;四&#xff09;列出所有可用的控制台键盘映射&#xff08;五…

Linux 命令之 locale -- 设置和显示程序运行的语言环境

文章目录命令介绍locale 设置规则使用详解&#xff08;一&#xff09;查看当前 locale 设置&#xff08;二&#xff09;查看当前系统所有可用 locale&#xff08;三&#xff09;设置系统的 locale命令介绍 locale 是 Linux 系统中多语言环境的设置接口&#xff0c;在 Linux 中…