Java 下一代: Groovy、Scala 和 Clojure 中的共同点(二)

了解Java 下一代语言如何减少样板代码和降低复杂性

Java 编程语言诞生时所面临的限制与如今的开发人员所面临的条件有所不同。具体来讲,由于上世纪 90 年代中期的硬 件的性能和内存限制,Java 语言中存在原语类型。从那时起,Java 语言不断在演化,通过自动装箱(autobox)消除了许 多麻烦操作,而下一代语言(Groovy、Scala 和 Clojure)更进一步,消除了每种语言中的不一致性和冲突。

在这 一期的文章中,我将展示下一代语言如何消除一些常见的 Java 限制,无论是语法上还是默认行为上。第一个限制是原语数 据类型的存在。

原语的消亡

Java 语言最开始有 8 对原语和相应的类型包装器类(最初用于解决性能和内存 限制),并通过自动装箱逐步地淡化了它们之间的区别。Java 下一代语言更进一步,让开发人员觉得好像根本不存在差别 。

Groovy 完全隐藏了原语类型。例如,int 始终表示 Integer,Groovy 自动处理数字类型的上变换,防止出现数 值溢出错误。例如,请查看清单 1 中的 Groovy shell 交互:

清单 1. Groovy 对原语的自动处理

groovy:000> 1.class
===> class java.lang.Integer
groovy:000> 1e12.class
===> class java.math.BigDecimal

在 清单 1 中,Groovy shell 显示,即使是常量也是通过底层的类来表示 的。因为所有数字(和其他伪装的原语)都是真正的类,所以可以使用元编程技术。这些技术包括将方法添加到数字中(这 通常用于构建特定领域的语言,即 DSL),支持 3.cm 这样的表达式。在后面介绍可扩展性的那期文章中,我会更全面地介 绍此功能。

与 Groovy 中一样,Clojure 自动屏蔽原语与包装器之间的区别,允许对所有类型执行方法调用,自动 处理容量的类型转换。Clojure 封装了大量底层优化,这已在语言文档中详细说明。在许多情况下,可提供类型 hints,使 编译器能够生成更快的代码。例如,无需使用 (defn sum[x] ... ) 定义方法,可以添加一个类型提示,比如 (defn sum [^float x] ... ),它会为临界区 (critical section) 生成更高效的代码。

Scala 也屏蔽了原语之间的区别,通 常对代码的时效性部件使用底层原语。它还允许在常量上调用方法,就像 2.toString 中一样。借助其混搭原语和包装器的 能力,比如 Integer,Scala 比 Java 自动装箱更加透明。例如,Scala 中的 == 运算符可在原语和对象引用上正确运行( 比较值,而不是引用),而不同于相同运算符的 Java 版本。Scala 还包含一个 eq 方法(以及一个对称的 ne 方法),它 始终比较底层引用类型是否等效。基本而言,Scala 会智能地切换默认行为。在 Java 语言中,== 会对引用数据进行比较 ,您几乎不需要这么做,可以使用不太直观的 equals() 比较值。在 Scala 中,== 能正确运行(比较值),无论底层实现 是什么,它还提供了一个方法来执行不太常见的引用相等性检查 (reference equality check)。

Scala 的这一特性 表明,Java 下一代语言的一个重要优势在于:将低级细节卸载到语言和运行时,开发人员能够有更多的时间考虑更高级的 问题。

简化默认行为

人们的看法高度一致,大部分 Java 开发人员都认为,在 Java 语言中常见的操作需要 太多的语法。例如,属性定义和其他样板代码使类定义变得很杂乱,掩盖了重要的方法。所有 Java 下一代语言都提供了简 化创建和访问过程的途径。

Scala 中的类和 case 类

Scala 已简化了类定义,可为您自动创建存取函数、赋 值函数和构造函数。例如,请查看清单 2 中的 Java 类:

清单 2. Java 中简单的 Person 类

class 

Person {
    private String name;
    private int age;

    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return name + " is " + age + " years old.";
    }
}

清单 2 中惟一的非样板代码是改写的 toString() 方法。构造函数和所有方法都由 IDE 生成。相比快速生成代 码,在以后轻松理解它更为重要。无用的语法增加了您在理解底层含义之前必须使用的代码量。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索java
, 语言
, java中的方法的使用
, 方法
, scala
, clojure
, 类型
, 自动
, 操作系统 pv原语
自动添加代码java
scala groovy clojure、java scala groovy、groovy clojure、clojure scala、clojure和scala,以便于您获取更多的相关知识。

时间: 2024-11-01 00:58:42

Java 下一代: Groovy、Scala 和 Clojure 中的共同点(二)的相关文章

Java 下一代: Groovy、Scala 和 Clojure 中的共同点(一)

探究这些下一代 JVM 语言如何处理操作符重载 编程语言中的好理念可以延续并扩展到其他语言,就像美酒一样历久弥香.因此,不足奇怪的是,Java 下一代语言 - Groovy.Scala 和 Clojure - 具有很多共同的特性.在本期和下一期 Java 下一代 文章中,我将探讨每种语言语法中功 能清单的一致性.我从能够重载操作符这个特性说起  - 克服了Java 语言中长期存在的一个缺点. 操作符重 载 如果您改造过 Java BigDecimal 类,可能看到过类似于清单 1 的代码: 清单

Java 下一代: Groovy、Scala 和 Clojure 中的共同点(三)

反思异常.表达式和空 在 上一期文章 中,我介绍了 Java 下一代语言用来消除 Java 语言中华而不实的东西和复杂性的创新方式.在这一期 文章中,我将展示这些语言如何消除 Java  的一些瑕疵:异常.语句与表达式,以及围绕 null 的边缘情况. 表达式 Java  语言从 C 语言那里继承的一项传承是区分编程语言 和编程表达式.Java 语句的示例包 括使用 if 或 while 的代码行,以及使用 void 来声明不会返回任何值的方法的代码行.表达式(比如 1 + 2 )用于求取 某一

Java 下一代: 没有继承性的扩展(二)探索 Clojure 协议

"没有继承性的扩展,第 1 部分" 主要讨论了 Goovy.Scala 和 Clojure 中为现有类添加新方法的机制,这也是 Java 下一代语言实现无继承扩展的方法之一.本文将探讨 Clojure 的协议如何以创新的方法拓展 Java 扩展功能,为表达式问题提供出色的解决方案. 尽管这期文章主要关注可扩展性,但也会略为涉及一些允许 Clojure 和 Java 代码无缝互操作的 Clojure 特性.这两种语言有着根本性的差别(Java 是命令式.面向对象的:而 Clojure 是

介绍Java下一代语言Clojure、Scala和Groovy的共同点

在 上一期文章 中,我介绍了 Java 下一代语言用来消除 Java 语言中华而不实的东西和复杂性的创新方式.在这一期文章中,我将展示这些语言如何消除 Java 的一些瑕疵:异常.语句与表达式,以及围绕 http://www.aliyun.com/zixun/aggregation/19527.html">null 的边缘情况. 表达式 Java 语言从 C 语言那里继承的一项传承是区分编程语言 和编程表达式.Java 语句的示例包括使用 if 或 while 的代码行,以及使用 void

了解Groovy、Scala和Clojure如何将行为融入到Java类中

Java 语言的设计有目的地进行了一定的删减,以避免前代产品中已发现的一些问题.例如,Java 语言的设计人员感觉 C++++ 中的多重继承性带来了太多复杂性,所以它们选择不包含该特性.事实上,他们在该语言中很少构建扩展性选项,仅依靠单一继承和接口. 其他语言(包括 Java 下一代语言)存在巨大的扩展潜力.在本期和接下来的两期文章中,我将探索扩展 Java 类而不涉及继承性的途径.在本文中,您会了解如何向现有类添加方法,无论是直接还是通过语法糖 (syntactic sugar). 表达式问题

Groovy、Scala 和 Clojure 如何将行为融入到类中

Java 语言的设计有目的地进行了一定的删减,以避免前代产品中已发现的一些问题.例如,Java 语言的 设计人员感觉 C++ 中的多重继承性带来了太多复杂性,所以它们选择不包含该特性.事实上,他们在该语言 中很少构建扩展性选项,仅依靠单一继承和接口. 其他语言(包括 Java 下一代语言)存在巨大的扩 展潜力.在本期和接下来的两期文章中,我将探索扩展 Java 类而不涉及继承性的途径.在本文中,您会了解 如何向现有类添加方法,无论是直接还是通过语法糖 (syntactic sugar). 表达式

在日益壮大的多语言世界中使用Groovy、Scala和Clojure

在与 Martin Fowler 共同参加的一次主题演讲中,他提供了一个敏锐的观察报告: Java 的遗产是 平台,不是 语言. 最初的 Java 技术工程师曾做过一个了不起的决定,将语言从运行时中分离出来,最终使 200 多种语言可在 Java 平台上运行.该基础架构对平台保持长久活力非常关键,因为计算机编程语言的寿命通常很短.自 2008 年以来,每年由 Oracle 主办的 JVM 语言峰会都会为 JVM 上替代语言的实现者提供与平台工程师公开合作的机会. 欢迎来到 Java 下一代专栏系

Groovy、Scala 和 Clojure的使用

在与 Martin Fowler 共同参加的一次主题演讲中,他提供了一个敏锐的观察报告: Java 的遗产是 平台,不是 语言. 最初的 Java 技术工程师曾做过一个了不起的决定,将语言从运行时中分离出来,最终使 200 多种语言可在 Java 平台 上运行.该基础架构对平台保持长久活力非常关键,因为计算机编程语言的寿命通常很短.自 2008 年以来,每年由 Oracle 主办的 JVM 语言峰会都会为 JVM 上替代语言的实现者提供与平台工程师公开合作的机会.   欢迎来 到 Java 下一

Groovy、Scala和Clojure共享的函数结构及其优势

本期文章将展示常见的函数式编程结构在 Java 下一代语言中的表示方式,指出那些功能在实现细节上的一些细微差别. 当垃圾回收成为主流时,它消除了所有类别的难以调试的问题,使运行时能够为开发http://www.aliyun.com/zixun/aggregation/7187.html">人员管理复杂的.容易出错的进程.函数式编程旨在为您编写的算法实现同样的优化,这样您就可以从一个更高的抽象层面开展工作,同时运行时执行复杂的优化. Java 下一代语言并不都占用从命令式到函数式的语言频谱的