穹顶灯打不出阴暗面_Java 8星期五:Java 8的阴暗面

穹顶灯打不出阴暗面

在Data Geekery ,我们喜欢Java。 而且,由于我们真的很喜欢jOOQ的流畅的API和查询DSL ,我们对Java 8将为我们的生态系统带来什么感到非常兴奋。

Java 8星期五

每个星期五,我们都会向您展示一些不错的教程风格的Java 8新功能,这些功能利用了lambda表达式,扩展方法和其他出色的功能。 您可以在GitHub上找到源代码 。

Java 8的阴暗面

到目前为止,我们已经展示了这个主要新版本中令人激动的部分 。 但是也有一些警告。 其中很多。 那件事

  • ……令人困惑
  • … 错了
  • …被省略(目前)
  • …被省略(很长时间)

Java主要版本始终有两个方面。 从好的方面来说,我们获得了许多新功能,大多数人会认为这已经过期了 。 其他语言,平台早在Java 5之前就有泛型。其他语言,平台早在Java 8之前就有lambda。但是现在,我们终于有了这些功能。 在通常的古怪Java方式中。

Lambda表达式的引入非常优美。 从向后兼容的角度来看,能够将每个匿名SAM实例编写为lambda表达式的想法非常引人注目。 那么,什么黑暗面到Java 8?

超载变得更糟

重载,泛型和vararg不是朋友。 我们已经在上一篇文章以及这个Stack Overflow问题中 对此进行了解释 。 在您的奇怪应用程序中,这些可能并非每天都有问题,但对于API设计人员和维护人员而言,这是非常重要的问题。

使用lambda表达式,事情变得“更糟”。 因此,您认为您可以提供一些便利的API,以重载现有的run()方法(该方法接受Callable并接受新的Supplier类型:

static <T> T run(Callable<T> c) throws Exception {return c.call();
}static <T> T run(Supplier<T> s) throws Exception {return s.get();
}

看起来非常有用的Java 7代码现在是Java 8的一大难题。 因为您不能只使用lambda参数简单地调用这些方法:

public static void main(String[] args)
throws Exception {run(() -> null);//  ^^^^^^^^^^ ambiguous method call
}

倒霉。 您将不得不采用以下任一“经典”解决方案:

run((Callable<Object>) (() -> null));run(new Callable<Object>() {@Overridepublic Object call() throws Exception {return null;}});

因此,尽管总有变通办法,但这些变通办法总是“糟透了”。 即使从向后兼容的角度来看事情不会中断,这也真是令人沮丧。

并非所有关键字都支持默认方法

默认方法是一个不错的补充。 有人可能声称Java最终具有特质 。 其他人显然与该术语脱离了关系,例如Br​​ian Goetz:

向Java添加默认方法的主要目标是“接口演变”,而不是“穷人的特征”。

如lambda-dev邮件列表中所示。

事实是,默认方法与Java中的其他任何东西相比,都有很多正交和不规则的特征。 这里有一些批评:

他们不能成为最终的

鉴于默认方法也可以用作API中的便捷方法:

public interface NoTrait {// Run the Runnable exactly oncedefault final void run(Runnable r) {//  ^^^^^ modifier final not allowedrun(r, 1);}// Run the Runnable "times" timesdefault void run(Runnable r, int times) {for (int i = 0; i < times; i++)r.run();}
}

不幸的是,以上操作是不可能的,因此第一个重载的便捷方法可能会在子类型中被覆盖,即使这对API设计人员而言毫无意义。

无法使其同步

mm! 用语言难以实现吗?

public interface NoTrait {default synchronized void noSynchronized() {//  ^^^^^^^^^^^^ modifier synchronized//  not allowedSystem.out.println("noSynchronized");}
}

是的, synchronized很少使用,就像决赛。 但是,当您拥有该用例时,为什么不仅仅允许它呢? 是什么使接口方法主体如此特别?

默认关键字

这可能是所有功能中最怪异和最不规则的。 default关键字本身。 让我们比较一下接口和抽象类:

// Interfaces are always abstract
public /* abstract */ interface NoTrait {// Abstract methods have no bodies// The abstract keyword is optional/* abstract */ void run1();// Concrete methods have bodies// The default keyword is mandatorydefault void run2() {}
}// Classes can optionally be abstract
public abstract class NoInterface {// Abstract methods have no bodies// The abstract keyword is mandatoryabstract void run1();// Concrete methods have bodies// The default keyword mustn't be usedvoid run2() {}
}

如果从头开始重新设计该语言,则可能不需要任何abstractdefault关键字。 两者都是不必要的。 存在或不存在主体的事实足以使编译器评估方法是否抽象。 即,情况应该如何:

public interface NoTrait {void run1();void run2() {}
}public abstract class NoInterface {void run1();void run2() {}
}

上面的内容将更加精简和规范。 遗憾的是,EG从未真正讨论过default的用途。 好吧,这是经过辩论的,但是EG从来不想接受这种选择。 我已经尝试过运气,下面的响应 :

我不认为#3是一种选择,因为与方法主体的接口一开始是不自然的。 至少指定“默认”关键字为读者提供了某种语言来说明该语言允许使用方法主体的原因。 就个人而言,我希望接口将保持纯合同形式(不执行),但是我不知道有更好的选择来发展接口。

同样,这是EG的明确承诺,即不承诺Java中的“特征”。 默认方法是实现1-2个其他功能的纯粹必要手段。 他们从一开始就没有精心设计。

其他修饰符

幸运的是,在项目后期,使用了static修饰符使其成为规格。 因此现在可以在接口中指定静态方法。 但是由于某种原因,这些方法不需要(也不允许!) default关键字,它必须是EG完全随机决定的,就像您显然无法在接口中定义static final方法一样。

虽然可见性修饰符已在lambda-dev邮件列表中进行了讨论 ,但超出了此发行版的范围。 也许,我们可以在将来的版本中获得它们。

实际上很少执行默认方法

有些方法可能在接口上使用了明智的默认实现,有人可能会猜测。 直观地,集合接口(例如ListSet会将它们放在其equals()hashCode()方法上,因为这些方法的协定在接口上定义良好。 它还使用listIterator()AbstractList实现,对于大多数定制列表而言,这是合理的默认实现。

如果对这些API进行改造,以使使用Java 8轻松实现自定义集合,那将是非常不错的。例如,我可以使我的所有业务对象都实现List ,而不会浪费AbstractList上的单个基类继承。

但是,可能有一个与向后兼容性相关的令人信服的原因阻止了Oracle的Java 8团队实现这些默认方法。 凡是向我们发送此原因的人都将获得免费的jOOQ标签 !

不是在这里发明的-心态

在lambda-dev EG邮件列表中也多次批评了这一点。 而且在撰写本博客系列文章时 ,我只能确认新的功能接口让人很难记住。 由于这些原因,他们感到困惑:

一些原始类型比其他更平等

与所有其他类型相比, intlongdouble基本类型是首选的,因为它们在java.util.function包以及整个Streams API中都具有功能接口。 boolean是二等公民,因为它仍然把它做成包在一个形式BooleanSupplierPredicate ,或者更糟: IntPredicate

所有其他原始类型在该区域中实际上并不存在。 即,没有针对byteshortfloatchar特殊类型。 尽管满足最后期限的争论无疑是有效的,但这种古怪的现状将使新手学习这种语言更加困难。

这些类型不只是称为函数

坦白地说。 所有这些类型都只是“功能”。 没有人真正关心ConsumerPredicateUnaryOperator等之间的隐式差异。

实际上,当您寻找具有非void返回值和两个参数的类型时,您可能会调用什么呢? Function2 ? 好吧,你错了。 它称为BiFunction

这是一个决策树,用于了解您要查找的类型如何被调用:

  • 您的函数返回void吗? 叫做Consumer
  • 您的函数返回boolean吗? 这叫做Predicate
  • 您的函数返回intlongdouble吗? 叫做XXToIntYYXXToLongYYXXToDoubleYY东西
  • 您的函数没有参数吗? 叫做Supplier
  • 您的函数是否接受单个intlongdouble参数? 它被称为IntXXLongXXDoubleXX东西
  • 您的函数是否接受两个参数? 叫做BiXX
  • 您的函数是否接受两个相同类型的参数? 叫做BinaryOperator
  • 您的函数返回的类型是否与作为单个参数的类型相同? 叫做UnaryOperator
  • 您的函数是否带有两个参数,第一个是引用类型,第二个是原始类型? 它称为ObjXXConsumer (只有使用该配置的使用者存在)
  • 否则:称为Function

好主啊! 最近,我们当然应该去Oracle Education检查Oracle Certified Java Programmer课程的价格是否急剧上涨了……幸运的是,有了Lambda表达式,我们几乎不必记住所有这些类型!

有关Java 8的更多信息

Java 5泛型为Java语言带来了许多很棒的新功能。 但是也有很多与类型擦除有关的警告。 Java 8的默认方法,Streams API和lambda表达式将再次为Java语言和平台带来很多很棒的新功能。 但是我们确信, Stack Overflow很快就会因在Java 8丛林中迷路的困惑程序员而引发问题。

学习所有新功能并非易事,但是新功能(和注意事项)仍然存在。 如果您是Java开发人员,则最好在有机会时立即开始练习。 因为我们还有很长的路要走。

翻译自: https://www.javacodegeeks.com/2014/04/java-8-friday-the-dark-side-of-java-8.html

穹顶灯打不出阴暗面

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

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

相关文章

【渝粤教育】广东开放大学 物业服务营销管理 形成性考核 (59)

选择题 题目&#xff1a; 单选 &#xff08; &#xff09;是物业服务产品的期望产品。 答案&#xff1a;看左侧 题目&#xff1a; 单选 &#xff08; &#xff09;是指模仿市场上旺销的其他物业服务企业的产品而开发的某种新产品。 答案&#xff1a;看左侧 题目&#xff1a…

【渝粤教育】广东开放大学 系统工程 形成性考核 (25)

选择题 题目&#xff1a;系统工程与系统科学的区别是&#xff0c;前者是工程技术&#xff0c;后者是基础理论。 答案&#xff1a;看左侧 题目&#xff1a;"有机论”生物学认为&#xff0c;有机体可分解为各个部分&#xff0c;各个部分的功能完全决定了系统的功能和特性。 …

Java 11:JOIN表,获取Java流

是否曾经想过如何将联接的数据库表转换为Java Stream&#xff1f; 阅读这篇简短的文章&#xff0c;并了解如何使用Speedment Stream ORM完成它。 我们将从Java 8示例开始&#xff0c;然后研究Java 11的改进。 Java 8和JOIN 速度允许将动态JOIN&#xff1a;ed数据库表作为标准J…

mysql宽字节注入_转宽字节注入详解

在mysql中&#xff0c;用于转义的函数有addslashes&#xff0c;mysql_real_escape_string&#xff0c;mysql_escape_string等&#xff0c;还有一种情况是magic_quote_gpc&#xff0c;不过高版本的PHP将去除这个特性。首先&#xff0c;宽字节注入与HTML页面编码是无关的&#xf…

【渝粤教育】电大中专中药制剂学 (2)作业 题库

1.根据药典、药品标准等将药物加工制成具有一定规格&#xff0c;可直接用于临床的药物制品&#xff0c;称为&#xff08;&#xff09;。 A.制剂 B.剂型 C.单味中药 D.中成药 E.炮制 错误 正确答案&#xff1a;左边查询 学生答案&#xff1a;D 2.药材经过炮制后可直接用于中医临…

mysql集群软件有哪些_浅谈数据库集群软件优缺点有哪些

满心狼藉回答时间&#xff1a;2019-12-05向TA提问集群(Cluster)是由两台或多台节点机(服务器)构成的一种松散耦合的计算节点集合&#xff0c;为用户提供网络服务或应用程序(包括数据库、Web服务和文件服务等)的单一客户视图&#xff0c;同时提供接近容错机的故障恢复能力。集群…

【渝粤教育】电大中专办公设备使用与维护 (2)作业 题库

1以下哪个不是现代办公硬件需求的主要依赖&#xff08;&#xff09;。 A扫描仪 B计算机 C办公桌 D打印机 错误 正确答案&#xff1a;左边查询 学生答案&#xff1a;B 2现代办公设备可分为计算机、通信&#xff08;&#xff09;三大类。 A电子工具 B办公机械 C路由器 D碎纸机 错…

input发送a.jax_JAX-RS 2.0中的透明PATCH支持

input发送a.jaxPATCH方法是最不受欢迎的HTTP方法之一&#xff0c;因为直到最近才真正没有一种标准的PATCH格式。 一段时间以来&#xff0c;它已经针对JSON进行了标准化&#xff0c;因此有很多库可以为您完成繁重的工作。 出于本博客的目的&#xff0c;我将使用json-patch&#…

python 日志函数参数_将日志信息作为参数传递给函数

我使用的Python库使用logging模块。但是&#xff0c;我创建了自己的log函数&#xff0c;脚本在内部使用。在下面是我要使用的日志记录功能&#xff1a;def log(name, content, swtch : bool None, time None):time time or datetime.now(pytz.timezone(US/Pacific))if swtch…

【渝粤教育】电大中专就业指导作业 题库

1.&#xff08; &#xff09;给中职生就业带来的机遇和挑战 A.一带一路 B.发展标准化服务业 C.“十三五”规划 正确 正确答案&#xff1a;左边查询 学生答案&#xff1a;C 2.最受企业欢迎的人才应具备&#xff08; &#xff09;素质 A.道德品质、文化认同、敬业精神、团队意识、…

python回车和换行的区别_回车与换行的解释~!

Unix/Linux和Windows回车换行Linux/Unix下的回车符与windows下的不同&#xff0c;Linux/unix下的回车符是0d,而在windows下则是0d0a&#xff0c;据说这和电脑刚开始发展时的电传打印机的速度有关。在计算机还没有出现之前&#xff0c;有一种叫电传打字机(teletype model 33)的玩…

【渝粤教育】电大中专常见病药物治疗作业 题库

1.作为退热药&#xff0c;阿司匹林的劣势是&#xff08; &#xff09;。 A.口服吸收迅速而完全 B.婴幼儿发热用阿苯片 C.儿童用药可引起Reye综合征&#xff0c;尤其是病毒性感染引起的发热 D.作用于下丘脑体温调节中枢 E.解热镇痛作用较强 错误 正确答案&#xff1a;左边查询 学…

在Spring Boot启动时运行代码

Spring Boot会自动为我们执行很多配置&#xff0c;但是迟早您将不得不做一些自定义工作。 在本文中&#xff0c;您将学习如何进入应用程序引导生命周期并在Spring Boot启动时执行代码 。 因此&#xff0c;让我们看看该框架提供了什么。 1. Bean初始化时执行方法 Spring启动您…

错误:在keystone中无法找到默认角色user_第四章 keystone认证组件安装1

1、在控制节点安装rabbitmq、memcached组件apt-get -y install rabbitmq-server memcached python-pymysql # 设置openstack用户 rabbitmqctl add_user openstack password #后一个password是密码&#xff0c;需要特别注意&#xff0c;要与后面组件访问时的密码一致 #设置ope…

【渝粤教育】电大中专建设工程法规1作业 题库

1.注册建造师应当在相应的岗位上执业。但同时&#xff0c;国家鼓励和提倡注册建造师( )。 A.一师多岗 B.一师全岗 C.一师专岗 D.专岗专职 正确 正确答案&#xff1a;左边查询 学生答案&#xff1a;A 2.下列规范性文件中,效力最高的是( )。 A.地方性法规 B.行政法规 C.行政规章…

【渝粤教育】电大中专新媒体营销实务 (13)作业 题库

1.新媒体在进行内容传播时&#xff0c;可以做到将文字、图片、视频等同时传播&#xff0c;呈现出&#xff08; &#xff09;的特点。 A.移动化 B.多元化 C.便捷性 错误 正确答案&#xff1a;左边查询 学生答案&#xff1a;A 2.第四媒体发展到宽带互联网阶段成为&#xff08; &a…

ubuntu加了张固态_将ubuntu系统迁移到ssd固态

朋友送了一个固态硬盘给我&#xff0c;因此将原机械硬盘上的系统迁移到固态硬盘上。原机械硬盘(dev/sdb)装有win10和ubuntu双系统。分区情况如下&#xff1a;sda1&#xff1a;ESP分区sda2&#xff1a;资料sda3&#xff1a;资料sda4&#xff1a;swap分区&#xff0c;被我干掉了&…

【渝粤教育】电大中专测量学 (3)作业 题库

试卷答案 1水准面是水体受地球重力的作用而形成的&#xff0c;其物理特点是在同一水准面上的任意一点具有相等的重力势位&#xff0c;上面任意一点的铅垂线都垂直于该点所在曲面的切平面。 A正确 B错误 正确 正确答案&#xff1a;左边查询 学生答案&#xff1a;A 2在地球表面&a…

php cdi_教程:编写自己的CDI扩展

php cdi今天&#xff0c;我将向您展示如何编写CDI扩展。 CDI提供了一种扩展功能的简便方法&#xff0c;例如 添加自己的范围&#xff0c; 启用Java核心类进行扩展&#xff0c; 使用注释元数据进行扩充或修改&#xff0c; 以及更多。 在本教程中&#xff0c;我们将实现一个…

【渝粤教育】广东开放大学 海外社交媒体营销 形成性考核 (45)

选择题 题目&#xff1a;经营战略计划的制定和实施&#xff0c;要以特定的()为依据。 答案&#xff1a;看左侧 题目&#xff1a;战略经营单位是企业值得为其专门制定一种经营战略的()经营单位。 答案&#xff1a;看左侧 题目&#xff1a;从20世纪初到第二次世界大战结束&#x…