BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

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

| 作者 Alex Blewitt 关注 4 他的粉丝 ,译者 赵震一 关注 0 他的粉丝 发布于 2013年3月26日. 估计阅读时间: 9 分钟 | Google、Facebook、Pinterest、阿里、腾讯 等顶尖技术团队的上百个可供参考的架构实例!

前些天,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

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT