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

java 接口 私有

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

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

该平台

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

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

JDK

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

  • JEP 221224 225261 :的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-RSJPAJAX-WSJDBC以及我认为应该远离Oracle的许多其他事情一起在做什么? 它们不是特定于平台的,可以由开源社区以更好的方式将它们设计为独立的软件包。 我认为,将它们汇总在一个巨型保护伞品牌下是一个错误。

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

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

语言

JavaJames 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-ioIOUtils实用程序类进行操作:

 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 接口 私有

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值