java:8最小镜像_Java:本地最小语言

java:8最小镜像

在1996年至2002年之间,我用Java编写了成千上万行代码。我用Java 1.0到Java 1.4编写了Web框架,电子表格以及更多内容。

与90年代中期(预模板)的C ++相比,Java是一种完全令人惊奇的语言。 JVM是所有计算机语言的最佳运行时。

漫长的奇异之旅

从2002年开始,我开始做C#。 然后是露比 然后是Scala。 一些Haskell,最近,我做了很多Clojure。

因此,我今年完成的Java 1.5 / Generics数量非常有限。

有一个Java演出

今年,我参加了一场演出,写了一些非常有趣的代码(编写了一个编译器)。 但是,客户是一家Java商店。 该项目已经具有Java基础。 客户坚决认为该项目全部用Java来完成……不是Scala……不是Clojure……不是JRuby,而是Java。

因此,过去6个月中,我花了数千行Java代码。 我已经看到Java在过去10年中如何发展,这令人震惊。 令人震惊的Java变得多么糟糕。

基本上,Java毫无意义。 据我所知,泛型将给定程序的总字符数增加约20%-30%。 虽然Scala的类型(带有类型推断)与Ruby相比是纯正的(在我看来,陪审团无法确定Scala的类型系统的重量与它相对于类型较少的Clojure的价值。)Java令人惊讶的冗长,视觉分散,丑陋的东西我可以想到泛型不值得在类型检查与Java 1.4的边际改进之间进行。

因此,我将介绍我认为可以使Java更好而又不会破坏语言的东西。

这不是“ Scala更好的帖子”

请注意,该帖子不是“ Scala更好”的帖子。 尽管文章中的某些想法来自Scala,但我认为Scala(或Clojure)不能替代Java。 Scala只是一种语言,我已经看到大量的Scala滥用。

此外,我认为Scala在很大程度上已经遭受了Java的同样痛苦(增加了语言的负担和复杂性(主要是通过Scala的类型系统)来解决边际问题),考虑到两种语言,这不足为奇的血统。

有些东西可能是在JDK 8中提出或提出的

这些是我的想法。 我不是JCP地区的球员。 感谢与Sam Pullara的出色午餐,我了解Java 8中的lambda。 但是我没有处理太多的JCP流量,因此JCP提案可能涵盖了这些想法。

默认公开

除非有明确的可见性级别,否则将所有声明默认为public 。 是的,我知道这会破坏现有的一些代码,但是让我们将默认值设置为正确的值即可。

为什么? 由于我们的代码中包含的噪声越少,信号越突出。

最后一个表达式是返回值

信号变得更有价值的另一个地方不再需要return关键字。 最后一个表达式成为返回值:

int plusOne(int x) {x + 1;}

仅当方法中没有return语句时才适用。 因此,如果您打算将return用于控制流编程,则必须明确。 但是对于小型,简单的方法,摆脱return意味着更少的视觉噪音。

块表达式

花括号中的任何内容都是一个块表达式,而不是一个块语句。 这意味着如果花括号的东西可以是一个表达式,则将其视为此类。

String s = {var d = new Date();"The current date is "+d;
}

某种类型推断

我希望看到自动分配推断。 基本上:

var name = "David"; // it's a String, duh

我们不需要使var为关键字。 基本上,类型var成为“推断类型”类型。

和基本的左侧参数类型推断(请注意,IntelliJ已经使用此语法):

List<String> stuff = new ArrayList<~>();

如果返回值只有一条路径(除了方法的最后一行,没有return语句),则返回类型推断:

plusOne(int x) // it's an int{x + 1;}

以上所有更改都可以使用编译器已知的数据来完成。 无需花哨的算法。 只是减少了程序中重复单词的数量……而通过泛型类型推断,无论如何,IDE都已经显示了它们。

更好的平等测试

===添加为equals方法的别名,但要求===的右侧与右侧协变。

另外,将!==添加为!equals

具有元数据的简单,不可变的数据结构

用Java表示简单数据是一个巨大的痛苦。 是的,IDE在创建getter / setter方面大有帮助。 但是最终,我们的许多程序都包含原始数据。 因此,我建议向Java添加内部数据结构。

这些是Scala的案例类与Clojure的元数据工具的组合。

struct只能在顶级公共类中。

例如:

public class MyStuff {struct Name(firstName = "David", lastName = "Pollak", age = 49, Date birthday = null)public static boolean funWithNames() {var archer = Name("Archer").age(10);var tessa = Name().firstName("Tessa").lastName("kitten").age(1);assert(tessa.age === 1);assert(tessa.getAge() === 1);archer !== tessa;}public static void metaData() {var david = Name("David", "Pollak");Name d2 = david.setMeta("geek", "true");assert(david === d2); // metadata not part of equality testingassert(david != d2); // object instances not the sameassert(david.getMeta("geek") === null);assert(d2.getMeta("geek") === "true");}
}

你从struct得到什么?

  • 不可变对象的创建,无需使用每个参数的new且具有位置构造函数,以及简单的名义上的创建和新值链接。
  • 与每个struct相关联的元数据的Map<String, String>
  • 每个字段的默认值。 这允许添加字段,并且带有附加参数的新版本库不会破坏访问旧版本的代码。
  • 一个toString方法,它输出字段名称和值。
  • 一个正确实现的equals方法,可以通过对空字段的适当处理来进行所有字段比较。
  • 计算哈希码的hashCode方法(如果已知所有字段都是不可变的,则应将其缓存)。
  • 字段级访问器方法。
  • 每字段复印机: field(param)这允许创建具有新值的新实例。 元数据已复制。
  • 每个struct都有大量的元数据,包括字段名称列表,每个字段的类型。 该元数据可用于快速,高效,自动生成的一组序列化器/反序列化器(例如JSON,JDBC,XML)。

另外,请注意定义的语法。 如果可以,则推断类型。

对于每个包含struct类,将有一个ClassName.struct接口。 该接口由所有struct实现,并且该接口包含所有共享字段。 例如:

class People {struct Parent(String name = null, List<People.struct> kids = null)struct Kid(String name = null, Parent parent = null)String getName(struct person) {person.name;}
}

注解也可以完成很多事情(例如,增强struct的JSON可序列struct等)

但是,采用轻量级的方法在语言级别定义数据模式可以使代码编写更快,更易于维护并且更具可读性。

精铸

Java转换过于冗长且容易出错。 使用if / instanceof / cast模式需要大量代码,并且非常容易出错,因为该类被指定了两次……一次在测试中,一次在强制转换中。

我们可以从Scala借用我最喜欢的功能之一:模式匹配,但是只需执行以下操作:

String testIt(Object o) {switch o {String s: s;Number n: "It's a number: "+n;Date d if d.millis() > 0: {var formattedDate = formatDate(d);"It's a modern date: "+formattedDate;}default: "No clue";}
}

好吧...我们有什么? 该类已测试。 如果类是匹配项,则将其分配给变量(仅具有行范围)。 接下来,运行警卫,看看是否应该采取这种行动。 如果是这样,请运行:右侧的表达式。

请注意,这种形式的切换是一种表达方式,而不是一条声明。 另外,请注意,不会掉线。

那么,这还能使事情变得更容易吗?

String whatSize(int i) {switch i {v if s < 10 : "small";v if s < 100 : "medium";default: "large";}
}

接下来我们可以将它应用于struct s(不,这不是模式匹配):

String aboutPerson(People.struct p) {switch p all {Parent p: "A parent named "+p.name+" #"+p.kids.size();Kid k: "A kid with "+(k.parent.kids.size() - 1)+" sibs";}
}

express之后的all关键字表示必须匹配。 如果将新的struct添加到类中,这将很有用,因为所有在该struct上打开的位置都将标记一个编译时错误。

不变的收藏

Java迫切需要一个出色的不可变集合包。

基本上,该软件包是Clojure出色的MapVector类的纯粹复制品。 我们不需要很多花哨的Scala风格的收藏。

实现java.util.Listjava.util.Map不可变集合。 基本上,这些集合将是独立的。

与JDK 8 lambda结合使用时,我会从Scala和Clojure那里获得我在收集操作方面的全部心血。

所以你有它

所以你有它。 我认为以上内容将使Java更易于处理语言。 它将减少冗长。 它将允许将数据作为相当普遍的数据进行处理,尤其是在编写将数据编组进出系统的服务时。

上述更改将减少Java的冗长性,而不会显着降低Java的“讲述故事”代码。 而且,是的,有可能编写相当难以理解的Scala代码。 我们不想去Scala去的地方。

我还想看什么? 按名称调用参数(我不知道它们是否会成为lambda的一部分)。 属性。 看看是否有可能在Java中进行某种形式的全局类型推断也将很有趣。 但是所有这些东西都是另一天。

继续前进!

参考: Java: DPP博客博客中来自JCG合作伙伴 David Pollak 的本地最低语言标准 。

翻译自: https://www.javacodegeeks.com/2013/10/java-a-local-minimum-language-wise.html

java:8最小镜像

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/346816.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

seaborn无法import_无法导入seaborn

我在进口seaborn时有问题。我最近在我的电脑上安装了“Python”&#xff0c;并尝试使用seaborn pacjesge。我更新了scipy和{}。实际上&#xff0c;在更新scipy之前&#xff0c;python看不到{}。问题是什么&#xff1f;请帮帮我Python 2.7.10 |Anaconda 2.3.0 (64-bit)| (defaul…

project子项目之间任务关联_project项目任务类型,就这么简单

任务是Project中最重要的概念之一&#xff0c;它是组成项目的基本元素。在Project项目管理软件中&#xff0c;任务的类型被分为三类&#xff0c;它们分别是固定单位任务&#xff0c;固定工期任务和固定工时任务。对这些任务类型的认识和了解&#xff0c;项目团队可以充分的协调…

邪恶的Java技巧使JVM忘记检查异常

我长期以来一直批评Java中的编译器检查异常机制。 无论您是爱还是恨&#xff0c;都可以肯定一件事&#xff1a;在某些情况下&#xff0c;您不想与他们打交道。 Java中的解决方案是将一个检查过的异常包装在new RuntimeException(e)但这可以提供较长的堆栈跟踪&#xff0c;而无需…

盲僧一键r闪用什么设置_美加狮R.A.T. PRO X3至尊版带你畅玩模拟飞行

很多模拟飞行或者皇牌空战的玩家们都追求在游戏过程中的真实驾驶体验&#xff0c;渴望通过游戏来实现自己的飞行梦。但普通鼠标的左右键及滚轮并不能带给玩家逼真的体验&#xff0c;美加狮全新发布的鼠标R.A.T. PRO X3至尊版却可以做到。美加狮R.A.T. PRO X3至尊版是美加狮全新…

input标签的值只能两位小数_Day51 HTML表格表单标签、flask框架

目录表格标签表单标签action标签input标签select标签textarea标签form表单提交文件需要注意flask框架1、表格标签<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>表格标签</title><meta name…

maven检测依赖_检测Maven依赖中介

maven检测依赖从Maven 2.0.9开始&#xff0c;已向Maven添加了一个称为依赖中介的新功能。 依赖关系中介是Maven在特定情况下在依赖关系树中多次出现依赖关系时用来解决项目依赖关系的技术。 通常&#xff0c;这发生在通过项目的依赖关系链接的传递依赖关系上。 在这些情况下&am…

webservice 参数太大_手把手系列:常用数据交换方案Web Service接口处理法

手把手系列&#xff1a;常用数据交换方案之Web Service接口处理法Web Service是一个SOA(面向服务的编程)的架构&#xff0c;是一个平台独立的&#xff0c;低耦合的&#xff0c;基于可编程的web的应用程序&#xff0c;可使用开放的XML标准来描述、发布、发现、协调和配置这些应用…

在事务外自动保存托管JPA实体

Spring中的存储库和事务并存。 Spring中的所有数据库访问都应在事务内运行&#xff0c;并且通常在某个地方使用Transactional来强制执行此操作。 但是&#xff0c;这并非总是必要的。 例如&#xff0c;当使用Spring Data时&#xff0c;您的存储库使用SimpleJPARepository来实现…

点击事件为什么会失效_Spring事务原理?事务在方法间如何传播?为什么会失效?...

推荐学习疯狂膜拜&#xff01;阿里出品Spring Security王者晋级文档肝了十天半月&#xff0c;献上纯手绘“Spring/Cloud/Boot/MVC”全家桶脑图前言事务我们都知道是什么&#xff0c;而Spring事务就是在数据库之上利用AOP提供声明式事务和编程式事务帮助我们简化开发&#xff0c…

wcdma系统随机接入过程的流程图_招聘电信协优初中级优化工程师、联通系统高级...

点击上方“通信人才网” 订阅&#xff01;招聘岗位招聘职位&#xff1a; 电信协优初中级优化工程师岗位类型&#xff1a;5G无线网络优化,4G-LTE无线网络优化,无线网优项目负责人,DT/CQT测试与分析,2G/3G无线网络优化工作地点&#xff1a; 西宁市,果洛藏族自治州,海南藏族自治州…

基于wincc的虚拟电梯设计_一文带你了解西门子整个虚拟调试与仿真软硬件体系...

写在面前大家好&#xff0c;我是小智&#xff0c;智能制造之家号主~经常有朋友关注到PLCSIM、SIMIT、Amesim、NX MCD、 Process Simulate、Plant Simulation等&#xff0c;但都不知道它们到底做啥的~因此今天对西门子仿真与虚拟调试进行整体介绍&#xff0c;力求让小白也能熟悉…

jedis使用 api_通过Jedis API使用排序集

jedis使用 api在上一篇文章中&#xff0c;我们开始研究Jedis API和Java Redis Client。 在这篇文章中&#xff0c;我们将研究Sorted Set&#xff08;zsets&#xff09;。 Sorted Set的工作方式类似于Set&#xff0c;它不允许重复的值。 最大的区别是&#xff0c;在“排序集”中…

三星ml1660拆机图解_炫龙DD2拆机,高性能的背后是怎样的面容?

双内存插槽 如标题所说&#xff0c;今天为大家带来炫龙DD2的图解拆机&#xff0c;废话少说&#xff0c;直接进入主题吧&#xff01;笔者对炫龙毁灭者DD2进行了简单拆解&#xff0c;拆解方式为打开D壳&#xff0c;查看散热模组和各部分硬件。炫龙毁灭者DD2延续了品牌一贯传统&am…

jwt-cli:一个用于解码JSON Web令牌(JWT令牌)的Shell库

当我开始经常需要解码JSON Web令牌时&#xff0c;我感到迫切需要编写允许我快速进行操作的程序。 有很多不错的选项&#xff0c;例如jwt.io &#xff0c;但是一旦您需要执行此操作&#xff0c;它通常就会变得笨拙。 而且&#xff0c;如果您需要处理多个令牌或进一步处理输出&am…

目录页码错误未定义书签怎么解决_目录页码对不齐应该怎么办?这2种方法,工作效率大增...

在制作文档目录时&#xff0c;你有没有遇到下图情况&#xff1a;右侧页码不对齐或者左侧文本不对齐&#xff0c;你一般是如何处理的&#xff0c;与大家分享相关的2种解决办法。工作效率大增&#xff01;1、目录页码不对齐该怎么办&#xff1f;遇到这种情况&#xff0c;一般是制…

三阶魔方大中小魔公式_三阶魔方的入门玩法教程|魔方玩法|魔方视频教程|魔方公式图解|--想成为魔方高手就来魔方乐园吧...

深圳魔方爱好者可以到实体店跟魔方老师学魔方了&#xff01;查询店铺地址在正式开始学习魔方还原前&#xff0c;请进入网站的首页&#xff0c;抽上10分钟的时间学习一些魔方的基础知识&#xff0c;这样会很有利于我们下面的学习&#xff0c;在还原的过程中有碰到疑问可以在线和…

初步了解Redis Streams以及如何在Java中使用它们

自今年年初以来&#xff0c;Redis Streams已进入Redis的unstable分支&#xff0c;并且第一个客户端始于采用Redis Streams API。 因此&#xff0c;这是一个绝佳的时机&#xff0c;可以从客户端角度看一下Redis Streams提供的功能以及如何使用它们。 免责声明&#xff1a;Redis…

权限丢失_不要让任何“账户权限”问题困扰你!

在Win10系统使用中时不时被“账户权限”问题困扰&#xff1f;别怕&#xff0c;有我呢~关闭更改系统相关设置时的通知不愿被安装软件、更改Windows设置时弹出的通知所打扰时&#xff0c;可以搜索【UAC】&#xff08;若没有搜索框&#xff0c;请使用【Win】【Q】快捷键调出&#…

python函数返回的元组_python – 从函数返回一个单独的元组元组

刚刚在Python中遇到了这样一些奇怪的事情&#xff0c;并且认为我会将其记录为一个问题&#xff0c;以防其他任何人试图用相同的无效搜索条件找到答案看起来像元组解包使得它不能返回长度为1的元组&#xff0c;如果您希望迭代返回值。虽然看起来似乎是欺骗。看到答案。>>&…

java 反射操作字段_x86上的Java最终字段没有操作?

java 反射操作字段我一直很乐于深入研究多线程编程的细节&#xff0c;并且尽管阅读了多年的CPU内存一致性模型&#xff0c;无等待和无锁算法&#xff0c;Java内存模型&#xff0c;实践中的Java并发性等知识&#xff0c;但我总是很喜欢。等等-我仍然会创建多线程编程错误。 总是…