Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Does Java 10 provide a val keyword? If not, why not?

Java 10 brings a C#-like var keyword for local type-inference.

But does Java 10 also provide a val keyword, as is found in Scala?

val would work like var but the binding would be final.

var x = "Hello, world. "; x = "abc"; // allowed  val y = "Hello, world. "; y = "abc"; // forbidden 

If it does not, is there a reason that this is the case?

like image 425
sdgfsdh Avatar asked Mar 22 '18 11:03

sdgfsdh


People also ask

Is Val a keyword in Java?

A number of possible keywords have been suggested: var - for mutable local variables. val - for final (immutable) local variables. let - for final (immutable) local variables.

Does Java have var keyword?

The var keyword was introduced in Java 10. Type inference is used in var keyword in which it detects automatically the datatype of a variable based on the surrounding context.

Should we use VAL in Java?

You can use val as the type of a local variable declaration instead of actually writing the type. When you do this, the type will be inferred from the initializer expression. The local variable will also be made final. This feature works on local variables and on foreach loops only, not on fields.

What is Val type in Java?

A ValueType is a type that represents a value. This is similar to how primitive types are represented in Java. The main difference is that ValueType is a reference type, which means that it can be stored in a variable or passed as an argument to a method.


2 Answers

There is no val in Java 10, as stated in JEP 286: Local-Variable Type Inference:

Syntax Choices

There was a diversity of opinions on syntax. The two main degrees of freedom here are what keywords to use (var, auto, etc), and whether to have a separate new form for immutable locals (val, let). We considered the following syntactic options:

  • var x = expr only (like C#)
  • var, plus val for immutable locals (like Scala, Kotlin)
  • var, plus let for immutable locals (like Swift)
  • auto x = expr (like C++)
  • const x = expr (already a reserved word)
  • final x = expr (already a reserved word)
  • let x = expr
  • def x = expr (like Groovy)
  • x := expr (like Go)

After gathering substantial input, var was clearly preferred over the Groovy, C++, or Go approaches. There was a substantial diversity of opinion over a second syntactic form for immutable locals (val, let); this would be a tradeoff of additional ceremony for additional capture of design intent. In the end, we chose to support only var. Some details on the rationale can be found here.

And here's the main reasoning:

I know this is the part people really care about :) After considering the pros and cons at length, there appears to be an obvious winner -- var-only. Reasons for this include:

  • While it was not the most popular choice in the survey, it was clearly the choice that the most people were OK with. Many hated var/val; others hated var/let. Almost no one hated var-only.

  • Experience with C# -- which has var only -- has shown that this is a reasonable solution in Java-like languages. There is no groundswell of demand for "val" in C#.

  • The desire to reduce the ceremony of immutability is certainly well-taken, but in this case is pushing on the wrong end of the lever. Where we need help for immutability is with fields, not with locals. But var/val doesn't apply to fields, and it almost certainly never will.

  • If the incremental overhead of getting mutability control over that of type inference were zero, there might be a stronger case, but it was clear that many people found two different leading keywords to be a distraction that kept their eyes from quickly settling on the important stuff. If variable names are more important than types, they're more important than mutability modifiers too.

(Source)

like image 135
Eran Avatar answered Sep 22 '22 05:09

Eran


Because there is final var for that in Java. If we had val too, there would be two things that mean the same. This is not good. There should be only one way to express a particular thing.

like image 42
ZhekaKozlov Avatar answered Sep 22 '22 05:09

ZhekaKozlov