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

java 接口 私有_Java 9:好的,坏的和私有的接口方法相关推荐

  1. 在java继承机制中 父类中的私有_Java中子类能继承父类的私有属性吗?

    前段时间去听老师讲课的时候,老师告诉我子类是可以继承父类所有的属性和方法的.当时我是极其疑惑的,因为之前学校考试时这个考点我记得很清楚:子类只能继承父类的非私有属性和方法.老师给我的解释是这样的--先 ...

  2. java 多线程 压缩_Java 多线程拷贝文件夹并调用tinyPng算法接口压缩图片实现(生产消费变种)...

    线程模型 生产者Provider线程为一,主要进行深搜目录文件:. 消费者Consumer线程多个, 因为RPC服务调用时延较长, 启用多个线程请求服务. 持久化线程Persist 将已经消费的消息存 ...

  3. java特殊类型_java中如何查找某个特定类型作为形参的方法

    import java.io.File; import java.io.IOException; import java.net.URL; import java.util.ArrayList; im ...

  4. java纪元时间_Java实现纪元秒和本地日期时间互换的方法【经典实例】

    Java实现纪元秒和本地日期时间互换的方法[经典实例] 发布时间:2020-09-07 22:58:35 来源:脚本之家 阅读:71 作者:FrankYou 本文实例讲述了Java实现纪元秒和本地日期 ...

  5. java 获取星期几_java中获取日期是星期几的两种方法

    java中取得指定日期是星期几可以采用下面两种方式取得日期是星期几:(推荐:java视频教程) 1.使用Calendar类//根据日期取得星期几 public static String getWee ...

  6. java 文件尾部_java 在file的尾部添加数据的两种方法总结

    java 在file的尾部添加数据的两种方法总结 问题描述: 在文件的末尾追加内容 方法1:利用RandomAccessFile类 1.将randomAccessFile模式设置为rw 2将rando ...

  7. java 空文件_java删除指定目录下所有空文件夹的方法

    本文实例讲述了java删除指定目录下所有空文件夹的方法.分享给大家供大家参考,具体如下: package com.func; import java.io.File; import java.util ...

  8. double java 精度丢失_java中double和float精度丢失问题及解决方法

    在讨论两位double数0.2和0.3相加时,毫无疑问他们相加的结果是0.5.但是问题总是如此吗? 下面我们让下面两个doubles数相加,然后看看输出结果: @Test public void te ...

  9. java 数组参数_java中 数组可以作为形式参数传递到调用的方法中吗?要怎么操作?...

    展开全部 可以,操作代码如下: public class ArrTest{ public static void doTest(String[] args){ for(int i=0;i System ...

  10. java隐藏密钥_java – 在Android中隐藏密钥库密码的最佳方法是什么?

    我是Android开发和实现SSLSockets的新手.在做了一些挖掘后,我能够设置一个正常工作的简单服务器/客户端.我认为实现可以使用一些工作,并且难以将密码加载到密钥库而不用纯文本.这是客户端的一 ...

最新文章

  1. xampp测试php代码,php用xampp测试
  2. C# 实现FTP上传与下载
  3. 深入Java中文编码乱码问题及最优解决方法
  4. Linux的复制命令的路径写法
  5. 5G NR资源分配中RIV指示的具体原理
  6. javaweb学习总结(十九):JSP标签
  7. HDU 4417 Super Mario(莫队 + 树状数组 + 离散化)
  8. elk 聚合日志_使用ELK堆栈进行日志聚合
  9. 保证主题,JMS规范和ActiveMQ的消息传递
  10. 小熊的人生回忆(三)
  11. 在VB中使用Linq To SQLite注意事项
  12. python3处理普通文件【open内置函数】
  13. win8.1删除桌面的IE图标
  14. UVA - 10827 Maximum sum on a torus
  15. 惊爆:江民公司官方网站今日被黑
  16. 美团(iOS客户端)面经
  17. 背景设置透明度字体不透明
  18. 解决hbase报错Master exiting
  19. 仿脉脉PHP源码,php,mysql_如何实现类似脉脉网的二维人际关系,php,mysql,算法,社区,社交 - phpStudy...
  20. 跨多行的单元格的html代码为,跨多行的单元格的 HTML 代码为()。

热门文章

  1. YBTOJ:圈套问题(分治法、鸽笼原理)
  2. AT4119-[ARC096C]Everything on It【斯特林数,容斥】
  3. P3806-【模板】点分治1
  4. ssl提高组周六备考赛【2018.10.27】
  5. nssl1191,P2700-逐个击破(平津战役)【并查集】
  6. 纪念中学15-5(=10)天感想
  7. ssl1007 and ssl -最大乘积 and 加法最大【区间dp练习】
  8. codeforces1496 D. Let‘s Go Hiking(乱搞+讨论)
  9. 【模拟】pjesma(jzoj 1151)
  10. 10、mysql数据表中数据的查询(2)