我对Valhalla项目的进度一直很感兴趣,但是Brian Goetz最近的信息“ Valhalla项目:目标 ”提高了我的兴趣。 我经常喜欢Goetz的作品,因为他结合了我最想成为技术作者的两个特征:他比他所写的内容更了解他所写的主题,而且还能够以可接近的水平介绍这些概念。向我们其他人缺乏他在这一领域知识的深度。 邮件“ Valhalla项目:目标 ”在许多方面都具有重要意义,并且很容易接近; 任何对Valhalla项目为何如此激动感兴趣的人都应该直接阅读该书。 尽管我建议阅读原始的,易于理解的消息 ,但我通过阅读本文中的此消息收集了一些意见。
在我的软件开发人员职业生涯中,无论我使用哪种编程语言,我通常都会发现大多数软件开发都需要一系列权衡取舍 。 遇到性能最好的代码比慢代码的可读性差的地方很常见。 实际上,这种权衡是导致过早优化的原因 。 过早优化的危险在于它是“过早的”,因为实际上并不需要通过可读性较低的代码获得的性能提升,因此人们正在有效地交换“更危险”或“更昂贵”的代码以获得不必要的性能优势。
在Java中,通常在使用对象时进行这种折衷。 对象通常更易于使用,并且是与高度使用的标准Java集合一起使用所必需的,但是对象的开销在内存和开销方面可能会非常昂贵。 Goetz在“ Valhalla项目:目标”中指出,Valhalla项目有可能成为相对罕见的情况之一,在这种情况下,可以实现“安全性,抽象性,封装性,表达性和[和]可维护性”。
Goetz提供了与对象和维护对象标识相关的成本的简要摘要。 从对在不需要对象身份的情况下维护对象身份的缺点的简要说明之后,Goetz转向了现在期望的Java值类型如何解决此问题的描述。 除了简要描述值类型的优点外,Goetz还为值类型提供了一些备用名称和短语,可能有助于更好地理解它们:
- “像Java类一样的聚合放弃了它们的身份”
- “代码就像一个类,就像一个整数一样工作”
- “更快的对象”
- “可编程原语”
- “便宜的东西”
- “更丰富的原语”
关于值类型,Goetz写道:“我们不必强迫用户在抽象/封装/安全性和性能之间进行选择。 我们可以同时拥有。” 我们不是每天都有蛋糕也可以吃 。
在“ Valhalla项目:目标”中,Goetz还讨论了“扩展泛型以允许对所有类型进行抽象的目标,包括基本类型,值甚至是void”。 他使用了JDK的示例,该示例需要在其API中提供多种方法来涵盖非引用类型但必须由API支持的项,因为“泛型目前仅限于仅对引用类型进行抽象。” Goetz指出,即使自动装箱允许在API中使用原语,并期望与该原语相对应的引用类型(例如将int
参数自动装箱为Integer
引用),这种装箱也会降低性能。 在对问题进行了适当的解释之后,Goetz总结道:“如果我们一次编写一个通用类或方法,并抽象所有可能的数据类型,而不仅仅是引用类型,那么对每个人来说都会更好。” 他补充说:“能够一次编写东西……意味着更简单,更富表现力,更常规,更可测试,更可组合的库,而在处理原语和值时不会像今天的拳击那样失去性能。”
Goetz在声明“ Valhalla:目标”时总结说:“ Valhalla可能是出于性能方面的考虑,但是将其视为增强抽象性,封装性,安全性,可表达性和可维护性的一种更好的方法-“不”放弃性能。 从这个角度来看,我真的很喜欢Valhalla项目:我们可以获得使用对象和引用类型的许多好处,同时又不放弃使用基元的性能好处。
Valhalla项目:目标为您提供了许多简洁而平易近人的思路。 阅读这篇文章增加了我对Valhalla项目的未来的兴趣,我希望我们可以在JDK中看到它。
翻译自: https://www.javacodegeeks.com/2016/10/value-project-valhalla.html