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