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角度来看, 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

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

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

相关文章

flex弹性盒子

注意事项 1.设为Flex布局之后,子元素的float,clear和vertical-align属性都讲失效 2.采用Flex布局的元素,称为Flex容器(Flex container),所有的子元素成为容器成员,称为Flex项目(Fle…

Oracle Golden Gate 系列十三 -- 配置GG进程检查点(checkpoint) 说明

一.Checkpoints 理论说明有关GG的Checkpoints 在系列一, GG的架构中以说明:OracleGolden Gate 系列一 --GG 架构 说明http://blog.csdn.net/tianlesoftware/article/details/6925907这里在单独拿出来说明一下,因为这是一个较为重要的概念。Ch…

开始JBoss BPM流程的3种基本方法

这一集提示和技巧将帮助您了解根据需要启动流程实例的最佳方法。 规划项目可能包括流程项目,但是您是否考虑过可以启动流程的各种方式? 也许您的JBoss BPM Suite在您的体系结构中本地运行,也许您在云中运行,但是无论它在哪里&am…

用asp.net编写冒泡排序法

这里写了一个冒泡排序的函数. int[] a newint[10] { 12,564,95,44,69,499,693,6746,6496,124}; for(inti0;i<a.Length;i) for(intj i1; j <10; j) { int min a[i]; if (a[i] > a[j]) //升序排列 …

使用Gradle构建和应用AST转换

最近&#xff0c;我想在Gradle项目中构建并应用本地ast转换。 虽然我可以找到一些有关如何编写转换的示例&#xff0c;但找不到完整的示例来显示完整的构建过程。 转换必须单独编译&#xff0c;然后放在类路径中&#xff0c;因此其源代码不能简单地放在Groovy源代码树的其余部分…

7月17日每日一答

1 什么是闭包函数&#xff0c;闭包函数满足什么样的条件&#xff1f;请写一个常见的闭包函数。 所谓的函数闭包本质是函数的嵌套和高阶函数。我们来看看要实现函数闭包要满足什么条件&#xff08;缺一不可&#xff09;&#xff1a; 1)必须嵌套函数 2)内嵌函数必须引用一个定义在…

vi 常用命令

一、vi简介 vi编辑器是所有Unix及Linux系统下标准的编辑器&#xff0c;它的强大不逊色于任何最新的文本编辑器&#xff0c;这里只是简单地 介绍一下它的用法和一小部分指令。由于对Unix及Linux系统的任何版本&#xff0c;vi编辑器是完全相同的&#xff0c;因此您可以在其 他…

Servlet基础(一)

JavaEE&#xff1a;企业级开发技术<一.基础概念>j2ee:jdk1.1--1.4 ----->> j2ee1.1 1.2 javaee:jdk--5,6,7 --->>javaee 5,6,7javaee与servlet,jsp Servlet:前后台传递数据&#xff0c;基于网络的HTTP请求的处理 实现需要借助web容器 J…

BZOJ1706奶牛接力跑

这个东西思路还是不错的。 解法就是把矩阵幂的加法改成取min&#xff0c;乘法改成加法就好&#xff0c;和floyed是一样的。这样的话&#xff0c;矩阵操作一次就相当于松弛了一次最短路。 建矩阵的过程也比较简单&#xff0c;可以离散化&#xff0c;当然下面有另一种更优秀的打法…

EJB 3.x:生命周期和并发模型(第2部分)

这是两部分系列的第二篇。 第一部分介绍了有状态和无状态EJB的生命周期以及并发行为。 在这篇文章中&#xff0c;我将介绍Singleton EJB 。 Singleton模式可以说是最常用&#xff08;有时被滥用&#xff01;&#xff09;的模式。 单吨又爱它&#xff01; Java EE使我们无需编…

MVC2中Area的路由注册实现

今天碰到了一个不可思议的bug&#xff0c;新增的controller中任何action都无法访问&#xff0c;都是返回404错误。一般这种错误要么是拼写错误&#xff0c;要么是不小心给action加了post属性&#xff0c;但是经过初步的排查&#xff0c;没有发现问题。而原有的controller中任何…

当Java 8 Streams API不够用时

Java 8与往常一样是妥协和向后兼容的版本。 JSR-335专家组可能无法与某些读者就某些功能的范围或可行性达成一致的发行版。 请参阅Brian Goetz关于为什么…的一些具体解释。 …Java 8默认方法中不允许“最终” …Java 8默认方法中不允许“同步” 但是今天&#xff0c;我们将…

Servlet - cookie、session、servletContext概述

1、cookie 在客户端的小纸条&#xff0c;存储在客户端一个servlet/jsp设置的cookies能被同一路径下面或者子路径下面的servlet/jsp读到&#xff0c;但子路径设置的cookies父路径读不到.添加cookie的方法&#xff1a; Cookie cookie new Cookie("aaa", "bbb&quo…

父类作为方法的形参以及父类作为方法返回值

1、父类作为方法的形参 语句&#xff1a;修饰符 父类类型 方法名(){} 2、父类作为方法返回值 语句&#xff1a;修饰符 void/返回值类型 方法名(父类类型 形参名){} 代码例子&#xff1a; 动物类&#xff1a; /*** author Mr.Wang* 宠物类**/ public abstract class Animals {pr…

在Spring Boot中使用@ConfigurationProperties

在最近的博客文章中&#xff0c;我简短地介绍了如何在Spring Boot应用程序中配置邮件 。 要将属性注入配置中&#xff0c;我使用了Spring的Value注释。 但是Spring Boot提供了一种使用属性的替代方法&#xff0c;该方法允许强类型的Bean来管理和验证应用程序的配置。 在本文中&…

unexpected AST node

hql语句错误&#xff0c;一般是比较明显的错误&#xff0c;仔细检查一下hql。转载于:https://www.cnblogs.com/chanedi/archive/2011/11/28/2265855.html

在Atlas服务器端实现中推荐使用Web Service而不是Page Method

English Version: http://dflying.dflying.net/1/archive/107_prefer_web_services_to_page_methods_in_atlas_server_side_implementation.html 我们可以用两种方式把一个服务器段方法暴露给客户端Atlas调用&#xff1a;Web Service和Page Method。我推荐使用Web Service的方…

es6严格模式需要注意的地方

1.块级函数 "use strict";if (true) {function f() { } // 语法错误} es5中严格模式下禁止声明块级函数&#xff0c;而在es6的严格模式中可以声明块级函数&#xff0c;并可以在块级作用 use strictvar b true;if(b){function test(){console.log(我是块级函数)}test(…

简而言之,JUnit:另一个JUnit教程

为什么还要另一个JUnit教程&#xff1f; 对于Java世界中的开发人员而言&#xff0c; JUnit似乎是最受欢迎的测试工具 。 因此&#xff0c;难怪就此主题已经写了一些好书 。 但是我仍然经常遇到程序员&#xff0c;他们至多对这个工具及其正确用法都不太了解。 因此&#xff0c;…

APUE Chapter 1 - UNIX System Overview

Section 1.1. Introduction转载于:https://www.cnblogs.com/s7vens/archive/2011/11/29/2266984.html