写点什么

Xtend 2.4 发布,新版添加了 Active 注解,对 Android 的支持等新特性

  • 2013-03-25
  • 本文字数:2618 字

    阅读完需:约 9 分钟

前些天,Eclipse 基金会宣布 Xtend 2.4 发布。Xtend 是一门静态类型的类 Java 编程语言,它可以被编译成 Java 代码并运行在 JVM(以及比如 Android 这样的类 JVM 系统)上。

与其他如 Scala 和 Kotlin 等基于 JVM 的编译型语言不同,Xtend 是先被转译成 Java 代码然后才使用标准的 Java 编译器进行编译的,所以通过它生产出的程序并没有向后兼容的问题。

Xtend 与例如 Groovy 和 JRuby/Jython 这样的解释型语言的不同之处在于它是静态类型的,并具有类型推导的功能以支持简化编码工作。这意味着将可以让 IDE 来实现代码重构和类型指定。

InfoQ 去年曾对 Xtend 1.0 版的发布进行过相关报道,而在这段时间里它已经发生了很多的变化。 2.4 版中的新特性包括了 active 注解、集合字面量、对 Android 的支持以及被改进的代码重构和内容辅助工具。

InfoQ 采访了 Xtend 的项目负责人 Sven Efftinge,并提出了一些列相关问题以了解更多关于 Xtend 新版本的内容:

InfoQ: Xtend 2.4 版的新特性之一是添加了对 active 注解的支持。你能描述下它们是什么,以及它们是如何减少样板代码的吗?

Sven Efftinge: 根本上来说是你先声明了一个注解并告诉编译器该如何将这些注解元素转译成 Java 代码。典型的使用案例是生成 JavaBean 的 getter 和 setter 方法,以及观察者或访问者等其它通用设计模式的代码——但是你可以结合它们做很多事。我们致力于使 active 注解的开发和部署变得非常容易。

举个例子,考虑到 Javabean 模式的属性。我们需要对其创建 get/set 方法对,这将导致一些被称为“Java 代码膨胀”的问题。在 Xtend 中,你只需要将你的字段声明为注解 property,Xtend 会自动处理剩下的工作:

复制代码
@Property String name

这行代码将被转译成以下 Java 代码:

复制代码
private String name;
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}

还有其他的一些注解,比如 @Data,可以自动为你生成 hashCode() 和 equals() 方法;而 @Observable 适用于为某个数据类自动生成对属性变化监听器的支持,详情见版本发布说明中的描述。

而最酷的事情是 IDE 和编译器将会感知你对代码的变更。所以当变更立即生效时,所有的键入、链接以及导航和内容辅助等功能都会按照预期的方式进行工作,

这才是代码生成功能应有的样子。

InfoQ: 另一项新的特性是字面量集合。使用字面量的数组,集合(set),映射 (map) 的语法是怎样的?它们可以嵌套吗?

Sven Efftinge: 它的语法是一个#号后面跟上一对大括号或方括号,对于 list 你可以像这样编写:

复制代码
val myList = #[1,2,3,4]

对于 set 是这样的:

复制代码
val mySet = #{1,2,3}

Map 可以使用元组操作符创建:

复制代码
val mySet = #{1->"one",2->"two" }

如果你希望使用数组类型时,List 字面量同样可以作为一个数组字面量来使用:

复制代码
val int[] myArray = #[1,2,3,4]

所以答案是肯定的,当它们作为表达式的时候可以被嵌套使用。

InfoQ: 字面量集合类型是可变的还是不变的?你如何通过字面量获取可变集合?

Sven Efftinge: 是的,他们是不变的。如果你想要可变的集合,可以选用一个工厂方法:

复制代码
val myArrayList = newArrayList(1,2,3,4)

当然,你同样可以通过使用已存在的不变 list 来重新构造它们。

InfoQ: 谈到字面量,请问什么是扩展提供者(extension provider)以及他们相比于扩展方法(extension method)有什么区别?

Sven Efftinge: 扩展提供者是那些在你程序范围内提供扩展方法的对象。以下的例子就是最好的说明。假设你有一个数据访问对象(DAO)类,它有一个方法 save(Entity)。

在 Java 中你必须这样写:

复制代码
myDao.save(myEntity)

在 Xtend 中你可以将 DAO 对象作为扩展提供者,使你可以将它的方法作为第一个参数类型的成员方法。所以你可以取而代之的写成这样:

复制代码
myEntity.save()

这是对 C#扩展方法(只有静态方法可以被作为扩展使用)的一种重要增强。扩展提供者使你可以很容易的替换实际的实现。

InfoQ: JDK 8 具有一个将 Lambda 表达式转换成单一抽象方法(SAM)类型的概念。而如今 Java 6 和 Java 7 配合 Xtend 后是不是也可以实现这样的功能?

Sven Efftinge: JDK 8 的只能将 Lambda 表达式转换成了所谓的功能性接口。在 Xtend 里也使用了同样的方式来实现。而新添加的部分是你现在可以将 SAM 类型与抽象类一起使用。它们作为“功能性 Java”在框架中被频繁地使用。

通过使用 Xtend,你无须等待 JDK 8 来实现这些功能。你今天就可以在 Java6 或 Java7 上实现。事实上,Xtend 与 Java 5 也是兼容的。

InfoQ: 说到向后兼容,Xtend 在这方面的情况又是怎样的?能够在 Xtend 1.0 下编译的程序是否仍然可以在 Xtend 2.4 下使用呢?

Sven Efftinge: 它们是二进制兼容的。所以在 Xtend 1.0 下可以编译的程序将无需任何二次编译或修改就能和 Xtend 2.4 一起工作。

尽管我们改进了编译器的错误报告功能,并可以对先前编译器无法警告你的语义错误进行高亮显示,但是在源码级别并没有重大变化,

不管是在编译级别还是源码级别,我们都非常谨慎地对待兼容性,

InfoQ: 可以将 Xtend 项目编译并安装到 Android 上似乎是该框架一个非常大的成功。鉴于使用 Scala 或 Kotlin 编译 Android 应用将会给打包带来更多兆的空间占用。相比于直接使用 Java 编程,使用 Xtend 编译 Android 应用平均会带来多大空间的增长?

Sven Efftinge: Xtend 编译生成的 Java 源代码最终会被编译成 Java 字节码,这确保了创建的字节码可以很好的工作在 Android 上。并且 Xtend 并没有自己独立的“胖”代码库,而只有少数几组将扩展方法添加到现存 JDK 类型的类(<40K)和 1.3M 大小的 Google Guava。

你可以使用 Xtend 编写漂亮高效的 Android 应用。

InfoQ: 编程语言的一个成功标准是看其是否具有良好的 IDE 支持。Eclipse 中对于 Xtend 的支持进展如何?

Sven Efftinge: IDE 具备了很多项功能,比如格式化工具,新的快速修复功能,新的代码重构工具以及显著改善的内容辅助功能。

编译器的性能同样也有了很大的提升。我们对如何在使用 Xtend 和 IDE 协同工作时建立一个好的流程给予了极大的关注。

不像其他基于 JVM 的那些语言,Xtend 可以与 JDT 一起工作。你无须替换 JDT 或启用编织(enable weaving)来使用它。此外,你可以使用任意版本的 Java 编译器来编译项目;并不局限你仅仅使用作为插件安装的版本。

Xtend 2.4 版可在 2.4 版发布说明处获取。更多关于 Xtend 的信息见 Xtend 主页。

查看英文链接 Xtend 2.4 Adds Active Annotations, Android Support and More

2013-03-25 03:571545
用户头像

发布了 52 篇内容, 共 23.4 次阅读, 收获喜欢 5 次。

关注

评论

发布
暂无评论
发现更多内容

Linux操作系统中软件安装:用RPM包管理器安装软件步骤

小魏写代码

有了向量数据库,我们还需要 SQL 数据库吗?

Zilliz

sql 向量数据库 zillizcloud rag

“边缘计算:从概念到实践的探索与思考“

future

写实风格3D模型材质贴图

3D建模设计

WebGL 3D渲染 three.js 材质纹理贴图 3D材质编辑

家页观察丨万华生态绿色化、工业化、数字化助力城市更新

极客天地

哪里有Parallels虚拟机资源?如何安装激活PD虚拟机?

Rose

Mac虚拟机下载 Parallels虚拟机下载 PD虚拟机授权秘钥

Microsoft Office LTSC 2021 Mac版授权许可下载

Rose

office2021下载 Office LTSC 2021 office2021 Mac破解版 office许可证下载

1688商品详情数据接口(1688.item_get)

tbapi

1688API接口 1688商品数据接口 1688商品详情数据接口 1688数据接口 1688商品详情API接口

苹果mac视频下载器:Downie4下载画质的设置方法

Rose

Mac 视频下载工具 Downie4许可证 Downie 4 Mac版 Downie4清晰度设置

解决Mac苹果上运行VMware Fusion虚拟机提示“未找到文件”的方法

Rose

未找到文件 VMware Fusion虚拟机 Mac虚拟机下载 VM激活秘钥

语音数据集:开启智能语音技术的新篇章

数据堂

Axure RP授权码 附汉化包下载 兼容M/intel

Rose

Axure RP 9汉化 Axure RP 9授权码 Axure RP 10 汉化版 mac破解软件下载 mac原型设计软件

语音数据集:推动人工智能语音技术的关键要素

数据堂

云原生与持续交付:加速软件交付与部署的革命

范艺笙冉

Topaz Photo AI 在导入图像时冻结 (Mac)

Rose

Topaz Photo AI 无法启动 Mac图像编辑

超60%项目来自高校科研院所 | 2023值得关注的硬科技创变者50强重磅发布

创业邦

GLTF 编辑器实现逼真3D动物毛发效果

3D建模设计

WebGL 3D渲染 three.js 材质纹理贴图 3D材质编辑

KaiwuDB 受邀亮相“ACDU 中国行”数据库技术沙龙(西安站)

KaiwuDB

KaiwuDB ACDB 中国行

解析小红书笔记详情API的最佳实践与案例分享

技术冰糖葫芦

API

从0到1快速入门ETLCloud

RestCloud

ETL 数据集成平台 数据集成工具

喜讯!云起无垠获评ISC 2023数字安全创新能力百强双料大奖

云起无垠

GLTF编辑器-位移贴图实现破碎的路面

3D建模设计

WebGL 3D渲染 three.js 材质纹理贴图 3D材质编辑

SVN客户端:Cornerstone mac版的配置与使用 附Cornerstone许可证

Rose

cornerstone 4破解 Mac版Cornerstone许可证 Cornerstone使用教程 Cornerstone如何配置

一篇文章彻底搞懂TiDB集群各种容量计算方式

TiDB 社区干货传送门

监控 管理与运维 TiDB 源码解读 TiKV 源码解读

3D 渲染如何帮助电商促进销售?

3D建模设计

WebGL 3D渲染 three.js 材质纹理贴图 3D材质编辑

苹果Mac图像修图软件Photomator和Pixelmator Pro 有什么区别?

Rose

Pixelmator Pro Mac修图软件 Photomator

如何使用 Transmit mac高效管理远程文件?

Rose

Transmit下载 Transmit mac使用教程 Mac远程管理软件 Transmit 中文 版

语音数据集:智能语音技术的燃料与推动力

数据堂

GLTF编辑器实现逼真的石门模型

3D建模设计

WebGL 3D渲染 three.js 材质纹理贴图 3D材质编辑

阿拉丁「全网小程序创新与发展共话系列峰会·杭州站」完美落幕

极客天地

Xtend 2.4发布,新版添加了Active注解,对Android的支持等新特性_Java_Alex Blewitt_InfoQ精选文章