在上一篇关于如何将jOOQ与Java 8和Nashorn结合使用的文章之后,我们的一位用户发现了使用jOOQ API的缺陷, 如用户组中所述 。 本质上,缺陷可以总结如下:

Java代码

package org.jooq.nashorn.test;public class API {public static void test(String string) {throw new RuntimeException("Don't call this");}public static void test(Integer... args) {System.out.println("OK");}
}

JavaScript代码

var API = Java.type("org.jooq.nashorn.test.API");
API.test(1); // This will fail with RuntimeException

经过一些调查和Attila Szegedi以及Jim Laskey (来自Oracle的Nashorn开发人员)的友好帮助,很明显,Nashorn消除了重载方法和vararg的歧义,这与旧Java开发人员所期望的有所不同。 报价阿提拉:

Nashorn的重载方法解析尽可能地模仿Java语言规范(JLS),但也允许特定于JavaScript的转换。 JLS说,当选择一种方法来调用重载名称时,仅当没有适用的固定arity方法时,才可以考虑使用可变arity方法进行调用。

我同意只有在没有适用的固定arity方法时才可以考虑使用可变arity方法。 但是,由于使用ToString , ToNumber , ToBoolean进行类型提升(或强制/转换),因此“适用”本身的整个概念已被完全更改,而不是直观上看起来与varargs方法“完全”匹配的对象更喜欢

让它沉下去!

既然我们现在知道Nashorn如何解决过载,我们可以看到以下任何一种有效的解决方法:

使用数组参数明确调用test(Integer [])方法:

这是最简单的方法,您可以忽略存在可变参数的事实,而只需创建一个显式数组即可:

var API = Java.type("org.jooq.nashorn.test.API");
API.test([1]);

这样明确地调用test(Integer [])方法:

这无疑是最安全的方法,因为您要消除方法调用中的所有歧义:

var API = Java.type("org.jooq.nashorn.test.API");
API["test(Integer[])"](1);

消除过载:

public class AlternativeAPI1 {public static void test(Integer... args) {System.out.println("OK");}
}

删除可变参数:

public class AlternativeAPI3 {public static void test(String string) {throw new RuntimeException("Don't call this");}public static void test(Integer args) {System.out.println("OK");}
}

提供确切的选择:

public class AlternativeAPI4 {public static void test(String string) {throw new RuntimeException("Don't call this");}public static void test(Integer args) {test(new Integer[] { args });}public static void test(Integer... args) {System.out.println("OK");}
}

用CharSequence(或任何其他“相似类型”)替换String:

现在,这很有趣:

public class AlternativeAPI5 {public static void test(CharSequence string) {throw new RuntimeException("Don't call this");}public static void test(Integer args) {System.out.println("OK");}
}

具体来说,我认为从Java角度来看, CharSequenceString类型之间的区别似乎是非常随机的。

商定,即使有可能,也很难用动态类型的语言实现重载的方法解析。 任何解决方案都是一种折衷方案,它将在某些方面引入缺陷。 或正如Attila所说:

如您所见,无论我们做什么,都会遭受其他损失; 重载方法的选择在Java和JS类型系统之间处于紧要关头,并且即使逻辑上的微小变化也非常敏感。

真正! 但是重载方法的选择不仅对很小的变化非常敏感。 也可以将Nashorn与Java互操作性一起使用! 作为API设计师,多年来,我已经习惯了语义版本控制 ,并且在保持API源代码兼容,行为兼容(如果可能)以及很大程度上与二进制兼容的情况下 ,要遵循许多细微的规则。

当您的客户使用Nashorn时,就不用管它了。 他们是自己的。 Java API中新引入的重载可能会严重破坏Nashorn客户端。 但是话又说回来,那是JavaScript,一种在运行时告诉您的语言:

['10','10','10','10'].map(parseInt)

…产量

[10, NaN, 2, 3]

…以及哪里

++[[]][+[]]+[+[]] === "10"

产生真实的! ( 这里的资料 )

有关JavaScript的更多信息, 请访问此入门教程 。

翻译自: https://www.javacodegeeks.com/2014/09/how-nashorn-impacts-api-evolution-on-a-new-level.html

Nashorn如何在新层面上影响API的发展相关推荐

  1. java zgc_现在该关注ZGC和昏暗的Nashorn的明星了:Java影响者参与其中

    java zgc JDK是一个不断变化的环境. 一些工具正在离开,其他工具正在到来,而幸运的工具则活着讲述着这个故事. 首先传来的消息 ,我们正在告别的Java EE和CORBA组件,那么很明显,JD ...

  2. 是时候关注ZGC和昏暗的Nashorn的明星了:Java影响者参与其中

    JDK是一个不断变化的环境. 一些工具正在离开,其他工具正在到来,而幸运的工具则活着讲述着这个故事. 首先传来的消息 ,我们正在告别的Java EE和CORBA组件,那么很明显,JDK 11代表的不仅 ...

  3. Java8 新特性:Lambda 表达式、方法和构造器引用、Stream API、新时间与日期API、注解

    Java8新特性:Lambda 表达式.方法和构造器引用.Stream API.新时间与日期API.注解 1.Java8新特性 1.1.主要的新特性: 1.2.编程风格 2.Lambda 表达式 2. ...

  4. .NET Framework 中新托管 Direct3D 图形 API 的简介

    .NET Framework 中新托管 Direct3D 图形 API 的简介 发布日期: 12/6/2004 | 更新日期: 12/6/2004 Yahya H. Mirza 和 Henry da ...

  5. JAVA 8 新日期和时间API 学习总结

    昨天学了Java8新的时间日期api,以前我们做时间计算大多涉及Date,Calendar类,现在几乎全部有了替代的API,使用更加简单易用,通过几个例子记录一下. 1.取得瞬间点 System.cu ...

  6. delphi 调用php接口_新浪图床 API 接口调用与请求方法详细教程

    新浪微博图床API在网上已经很多且大都封装成了API供别人调用,这里分享其核心代码.支持前台跨域请求,以POST方式提交图片即可.新浪图床可以将你的图片远程上传到新浪服务器,你可以选择调用本站的接口, ...

  7. 微软发布新Azure 媒体服务 API(V3),现已全面可用

    利用Azure媒体服务(Azure Media Services),客户可以大规模地编码.保护.编制索引和传送视频.最近,微软发布了在Azure中对此服务的几个增强改进,包括新Azure媒体服务API ...

  8. Java 8 新特性之Stream API

    1. 概述 1.1 简介 Java 8 中有两大最为重要的改革,第一个是 Lambda 表达式,另外一个则是 Stream API(java.util.stream.*). Stream 是 Java ...

  9. 【java8新特性】——Stream API详解(二)

    一.简介 java8新添加了一个特性:流Stream.Stream让开发者能够以一种声明的方式处理数据源(集合.数组等),它专注于对数据源进行各种高效的聚合操作(aggregate operation ...

最新文章

  1. linux之用户态和内核态
  2. SLAM Cartographer(17)分支定界闭环检测
  3. java预览表格预览文档_java 如何创建一个表格.docx
  4. mysql树形结构的效率_MySQL存储树形数据优化技笔记
  5. h264码流文件通过计算first_mb_in_slice区分帧边界
  6. Illustrator中文版教程,如何在AI中以不同的方式组合形状?
  7. (译)SDL.NET Surfaces 相关介绍
  8. (二)文档请求不同源之window.postMessage跨域
  9. 一、C++反作弊对抗实战 (基础篇 —— 4.利用消息钩子注入DLL)
  10. CVE-2015-1427(Groovy 沙盒绕过 代码执行漏洞)
  11. 在小百合注册了一个帐号
  12. ffmpeg一些基本用法
  13. 大数据时代——你是否希望“被遗忘”
  14. 【绝对干货】kafka偏移量设置
  15. rtx3060性能相当于什么水平 rtx3060参数
  16. Fabric CA官方文档翻译——Planning for a CA
  17. FileSystemWatcher触发多次Change事件的解决办法
  18. android 深度自定义View
  19. 输入圆半径计算圆周长、圆面积、圆球表面积,结果保留3位小数。 注意:输入的半径可能是整数,也可能是小数。
  20. 动态规划问题——招聘会

热门文章

  1. android:background大小,小Demo小知识-android:foreground与android:background
  2. (转)数据库可靠性/可用性、稳定性RTO/RPO
  3. java设计模式之状态模式_Java中的状态设计模式
  4. java中的可检查和不检查_检查Java测试中发生了什么
  5. 网页益智游戏怎么制作_休息一下,或者:如何使用Java 12制作出色的益智游戏...
  6. java分页中显示更多_早期更多失败– Java 8
  7. java web源代码_检测Java Web应用程序而无需修改其源代码
  8. 运动基元_发现大量Java基元集合处理
  9. Spring集成基础知识
  10. spring boot注释_使用Spring Boot和注释支持配置Spring JMS应用程序