Java 10提供val关键字吗?如果没有,为什么没有?

6 浏览
0 Comments

Java 10提供val关键字吗?如果没有,为什么没有?

Java 10引入了类似C#的var关键字,用于本地类型推断。但是,Java 10是否也提供了像Scala中那样的val关键字?valvar类似,但绑定是final的。var x = \"Hello, world. \"; x = \"abc\"; // allowed val y = \"Hello, world. \"; y = \"abc\"; // forbidden如果没有提供,这个情况有没有原因?

0
0 Comments

Java 10并未提供"val"关键字,原因是Lombok的存在。Lombok是一个库,它提供了对"val"的支持,即"final var"。然而,Lombok不是完美的解决方案,它存在一些问题,如与其他JVM语言的兼容性以及在混合模式项目中的使用等。因此,我们需要使用Lombok这个库来实现对"val"的支持。

然而,自从Lombok v1.18.22版本以后,Lombok不再使用一个大的hack来支持Java 10+。

所以,总结起来,为了使用"val"关键字,我们需要使用Lombok这个库。

0
0 Comments

Java 10没有提供"val"关键字的原因是因为Java中已经有"final var"可以实现相同的功能。如果同时存在"val"和"var",会有两种方式表示相同的意思,这并不好。应该只有一种表达特定事物的方式。

"var"也似乎没有表达出之前不可能的东西。"var"和"val"只是让代码变得更短而已。

"var"确实表达了之前不可能的东西:匿名类的真实类型。例如,现在可以使用"var foo = new Object() { int i = 1; };"并且不需要使用反射就可以访问"foo.i"。当然,这只在方法体内有用,因为只能返回超类型。

实际上在Java 8中也是可能的。例如,可以写成"t(new Object() { int i = 1; }).i",其中"t"的定义为"public static T t(T t) { return t; };"。

这是一个高度主观的答案,没有明确的依据。有很多种表达循环的方式:"for(;;)"、"for (x : y)"、".forEach"、"do..while"等等...这些都是不同风格的"for"循环。

"if"语句和"switch"语句也可以表达相同的意思,但同时存在这两种语句可以编写更清晰、更简洁的代码。"val"也可以帮助实现这一点。

对于那些不同意的人来说,始终可以使用Lombok。Lombok的"val"使Java更接近Kotlin,并允许利用遗留代码库进行现代化改进,以提高可读性、安全性和半正式的执行路径验证。

0
0 Comments

Java 10没有提供val关键字,原因如下:

根据JEP 286: Local-Variable Type Inference中的说明,对于语法的选择存在多种不同的观点。主要的选择是使用哪个关键字(var、auto等),以及是否为不可变局部变量使用单独的新形式(val、let)。考虑了以下几种语法选项:

- 只有var x = expr(类似于C#)

- var,以及val用于不可变局部变量(类似于Scala、Kotlin)

- var,以及let用于不可变局部变量(类似于Swift)

- auto x = expr(类似于C++)

- const x = expr(已经是保留字)

- final x = expr(已经是保留字)

- let x = expr

- def x = expr(类似于Groovy)

- x := expr(类似于Go)

经过大量的意见收集,var明显优于Groovy、C++或Go的方法。对于不可变局部变量是否使用第二种语法形式(val、let),意见多样。这将是为了额外的仪式感而换取更多的设计意图。最终,我们选择只支持var。有关该决策背后的一些细节可以在这里找到。

主要的原因如下:

- 虽然var在调查中并不是最受欢迎的选择,但显然是最多人接受的选择。很多人讨厌var/val,其他人讨厌var/let,几乎没有人讨厌var-only。

- C#的经验表明,这是Java类似语言中的一个合理解决方案。C#中对"val"没有声势浩大的需求。

- 减少不可变性的仪式感的愿望当然是可以理解的,但在这种情况下,它是在错误的一端推动。我们需要帮助实现不可变性的是字段,而不是局部变量。但var/val不适用于字段,而且几乎肯定永远不会适用。

- 如果在获得可变性控制的增量开销为零的情况下,可能会有更有力的理由,但很明显,许多人认为两个不同的关键字会分散注意力,使他们的眼睛无法迅速关注重要的内容。如果变量名比类型更重要,那么它们比可变性修饰符更重要。

,虽然不可变性很重要,但实际上,在局部变量中是我们最不需要帮助使其不可变的地方。局部变量不会发生数据竞争,大多数局部变量实际上是不可变的。我们需要更多帮助鼓励不可变性的是字段,但在那里应用类型推断是愚蠢的。

值得一提的是,有人提出了一种增强final的方法。也就是支持类似final varName = new Object()的用法。是否可以认为在方法中的final就是final var?这可能是一种天真的幻想。

有人认为肯定忽视了在大多数程序中,我们想要变量的情况要少得多,而不是常量。如果支持了val而不是var,这将更有益。人们也会停止声明变量,而使用常量就足够了。

例如,自从JavaScript添加了const关键字后,几乎没有人使用let,除非有必要。此外,认为两个关键字会分散注意力的论点是荒谬的。他们可以阅读所有这些显式类型声明,突然他们会因为var/val或var/let而分心无法理解代码?为了更好地支持可变性而不是不可变性,就像默认允许引用为null一样荒谬。

0