写点什么

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:571420
用户头像

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

关注

评论

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

AIGC:新AI时代,推动数字人进化的引擎

华为云开发者联盟

人工智能 华为云 华为云开发者联盟 企业号 7 月 PK 榜

【会议】《卧龙:苍天陨落》制作人山际真晃与总监平山正和将联袂出席 2023 中国游戏开发者大会(CGDC)

CGDC中国游戏开发者大会

设计 开发 游戏开发 ChinaJoy

AntDB数据库亮相2023操作系统产业大会,携手合作伙伴共建网信生态

亚信AntDB数据库

数据库 AntDB AntDB数据库 企业号 7 月 PK 榜

官宣!菁英实习生计划启动,百度大模型团队诚邀你的加入

飞桨PaddlePaddle

人工智能 百度 paddle 飞桨 百度飞桨

1W+规则,20W+字段,某城商行数据分类分级有多卷?

极盾科技

数据安全 数据分类分级

DevOps in China:15年来,DevOps在中国经历了什么?

DevOps和数字孪生

嵌入式DevOps

袋鼠云产品功能更新报告06期|数栈产品功能升级,做产品我们是认真的!

袋鼠云数栈

大数据 产品 数据中台

一文帮你搞定H5、小程序、Taro长列表曝光埋点 | 京东云技术团队

京东科技开发者

小程序 taro 前端 曝光埋点 企业号 7 月 PK 榜

保险企业如何做好数据安全合规与敏感数据保护

原点安全

数据安全 保险科技 敏感信息 敏感数据保护 个保

KaiwuDB CTO 魏可伟:多模架构 —“化繁为简”加速器

KaiwuDB

数据库 AIOT KaiwuDB 多模架构

IoT 场景下 TDengine 与老牌时序数据库怎么选?看看这份TSBS报告

爱倒腾的程序员

数据库·

Nautilus Chain 更换全新测试网,主网即将在不久上线

大瞿科技

同城双中心 DR Auto-Sync 主中心意外故障恢复

TiDB 社区干货传送门

数据库架构设计 7.x 实践

智能合约编写高级篇(一)获取区块时间

BSN研习社

继长白山历史文化园三园一区后,鼎益丰再造龙狮谷新项目

Geek_2d6073

大咖直播专场 | 数据库集群方案简介

KaiwuDB

KaiwuDB 数据库集群方案介绍

错过直播?快收藏详实回顾!Get「研发效能管理」7 步实践指南与案例剖析

极狐GitLab

gitlab DevSecOps 效能管理 GDAI 蔚来案例

【7.7-7.14】写作社区优秀技术博文一览

InfoQ写作社区官方

热门活动 优质创作周报

学到就是赚到!NodeJS 实战系列:个人开发者应该如何选购云服务

不在线第一只蜗牛

node.js 实战开发

一文读透,FreeSWITCH的originate命令解析及示例

快乐非自愿限量之名

教程 freesql

高效运营新纪元:智能化华为云Astro低代码重塑组装式交付

华为云开发者联盟

云计算 后端 华为云 华为云开发者联盟 企业号 7 月 PK 榜

与 AI 同行,利用 ChatGLM 构建知识图谱

NebulaGraph

人工智能 知识图谱 LLM

IT安全运维管理系统哪个好?适合中小企业的哪款好?

行云管家

云计算 IT运维 云管理 安全运维

极限抵御DDoS攻击!高防主机守护您的网站安全!

一只扑棱蛾子

高防主机

RisingWave 1.0 版本正式发布!

吴英骏

数据库 rust 云原生 数据架构 流处理

无代码落地进企业,轻流不断扩大交友圈

ToB行业头条

2023最新发布:Java 面试突击大全 带你摸熟 20+ 互联网公司面试考点

架构师之道

编程 程序员 java面试

当AGI遇上能源寡头,会碰撞出什么样的火花?

TE智库

特斯联

初窥低代码 | 社区征文

神木鼎

低代码 年中技术盘点

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