Nashorn如何在新层面上影响API的发展
在上一篇关于如何将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角度来看, CharSequence
和String
类型之间的区别似乎是非常随机的。
商定,即使有可能,也很难用动态类型的语言实现重载的方法解析。 任何解决方案都是一种折衷方案,它将在某些方面引入缺陷。 或正如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的发展相关推荐
- java zgc_现在该关注ZGC和昏暗的Nashorn的明星了:Java影响者参与其中
java zgc JDK是一个不断变化的环境. 一些工具正在离开,其他工具正在到来,而幸运的工具则活着讲述着这个故事. 首先传来的消息 ,我们正在告别的Java EE和CORBA组件,那么很明显,JD ...
- 是时候关注ZGC和昏暗的Nashorn的明星了:Java影响者参与其中
JDK是一个不断变化的环境. 一些工具正在离开,其他工具正在到来,而幸运的工具则活着讲述着这个故事. 首先传来的消息 ,我们正在告别的Java EE和CORBA组件,那么很明显,JDK 11代表的不仅 ...
- Java8 新特性:Lambda 表达式、方法和构造器引用、Stream API、新时间与日期API、注解
Java8新特性:Lambda 表达式.方法和构造器引用.Stream API.新时间与日期API.注解 1.Java8新特性 1.1.主要的新特性: 1.2.编程风格 2.Lambda 表达式 2. ...
- .NET Framework 中新托管 Direct3D 图形 API 的简介
.NET Framework 中新托管 Direct3D 图形 API 的简介 发布日期: 12/6/2004 | 更新日期: 12/6/2004 Yahya H. Mirza 和 Henry da ...
- JAVA 8 新日期和时间API 学习总结
昨天学了Java8新的时间日期api,以前我们做时间计算大多涉及Date,Calendar类,现在几乎全部有了替代的API,使用更加简单易用,通过几个例子记录一下. 1.取得瞬间点 System.cu ...
- delphi 调用php接口_新浪图床 API 接口调用与请求方法详细教程
新浪微博图床API在网上已经很多且大都封装成了API供别人调用,这里分享其核心代码.支持前台跨域请求,以POST方式提交图片即可.新浪图床可以将你的图片远程上传到新浪服务器,你可以选择调用本站的接口, ...
- 微软发布新Azure 媒体服务 API(V3),现已全面可用
利用Azure媒体服务(Azure Media Services),客户可以大规模地编码.保护.编制索引和传送视频.最近,微软发布了在Azure中对此服务的几个增强改进,包括新Azure媒体服务API ...
- Java 8 新特性之Stream API
1. 概述 1.1 简介 Java 8 中有两大最为重要的改革,第一个是 Lambda 表达式,另外一个则是 Stream API(java.util.stream.*). Stream 是 Java ...
- 【java8新特性】——Stream API详解(二)
一.简介 java8新添加了一个特性:流Stream.Stream让开发者能够以一种声明的方式处理数据源(集合.数组等),它专注于对数据源进行各种高效的聚合操作(aggregate operation ...
最新文章
- linux之用户态和内核态
- SLAM Cartographer(17)分支定界闭环检测
- java预览表格预览文档_java 如何创建一个表格.docx
- mysql树形结构的效率_MySQL存储树形数据优化技笔记
- h264码流文件通过计算first_mb_in_slice区分帧边界
- Illustrator中文版教程,如何在AI中以不同的方式组合形状?
- (译)SDL.NET Surfaces 相关介绍
- (二)文档请求不同源之window.postMessage跨域
- 一、C++反作弊对抗实战 (基础篇 —— 4.利用消息钩子注入DLL)
- CVE-2015-1427(Groovy 沙盒绕过 代码执行漏洞)
- 在小百合注册了一个帐号
- ffmpeg一些基本用法
- 大数据时代——你是否希望“被遗忘”
- 【绝对干货】kafka偏移量设置
- rtx3060性能相当于什么水平 rtx3060参数
- Fabric CA官方文档翻译——Planning for a CA
- FileSystemWatcher触发多次Change事件的解决办法
- android 深度自定义View
- 输入圆半径计算圆周长、圆面积、圆球表面积,结果保留3位小数。 注意:输入的半径可能是整数,也可能是小数。
- 动态规划问题——招聘会
热门文章
- android:background大小,小Demo小知识-android:foreground与android:background
- (转)数据库可靠性/可用性、稳定性RTO/RPO
- java设计模式之状态模式_Java中的状态设计模式
- java中的可检查和不检查_检查Java测试中发生了什么
- 网页益智游戏怎么制作_休息一下,或者:如何使用Java 12制作出色的益智游戏...
- java分页中显示更多_早期更多失败– Java 8
- java web源代码_检测Java Web应用程序而无需修改其源代码
- 运动基元_发现大量Java基元集合处理
- Spring集成基础知识
- spring boot注释_使用Spring Boot和注释支持配置Spring JMS应用程序