5
Local Variable Type Inference (mail.openjdk.java.net)
haocheng 積分 0 編輯於

這裡有相關的問卷: Local Variable Type Inference for Java1

看來有幾種選項,我個人是比較喜歡 var/val 啦,就像 Scala/Kotlin 一樣

popcorny 積分 1

java keyword不是有const嗎? 拿來這邊用不是剛剛好

Link1

IngramChen 積分 0

我覺得 final 比較好,因為在 java 裡比較好認。

  var barList = new ArrayList<String>();
  final fooList = new ArrayList<String>();

var/val 雖然有很多優點,短,而且一樣長,但這兩個字實在太像了,可讀性有點差。當然可以靠 IDE 上不同色來解決啦…

haocheng 積分 0

用 final 也不錯,不過這樣 final 有兩種不同寫法好像又怪怪的

popcorny 積分 0 編輯於

其實想想也不用那麼複雜

var barList = new ArrayList<String>();
final var fooList = new ArrayList<String>();

這樣跟

ArrayList<String> barList = new ArrayList<>();
final ArrayList<String> fooList = new ArrayList<>();

一致不也挺好?

var就特別拿來用在type inference, final就來決定是不是可被assign

IngramChen 積分 0

因為 這次是個 reboot 的機會,所以會想要一次到位把它搞定吧。參照別的語言 val/var/let 都用的很爽,我想 Java 也可以選擇比較簡潔的寫法。

我猜最後定案時大概是 val/var。哈

IngramChen 積分 0 編輯於

這個喔,var 在 java 不是 keyword,所以如果有人很無聊在 java 8 之前這樣寫程式:

class Container<var> {
  void add(var x) {
    var y = x;
  }
}

然後到 java 9 裡就 compile error 了吧

haocheng 積分 0

現在考慮的幾個選項 var/val/let 好像都不是 keyword...

IngramChen 積分 0

在 Dart 裡,也是有 var 的用法 (跟 js 一樣),也是到處都能寫。

不過 Dart 經過二年成熟後,他們最後的 code style 建議,你只該在 local 變數上使用 var,其他 instance field, method parameter 上都不該用。

Java 則是直接限制 var 只能在 local 變數上使用,這算是第一步就走對了,省得有人到處亂寫,影響程式可讀性。

haocheng 積分 0

有道理,var/val 雖然可以少打幾個字,不過可讀性也稍微差了一點

koji 積分 0

之前有同事用 lombok val 就讓我有點抗拒 ^^;;;

IngramChen 積分 0
import lombok.val;

val foo = new ArrayList<>();

我看了一下 lombok 的 val 是長這樣,實在有點無言… ,這寫法到了 java9 通通都要改了吧

話說 lombok 對 Java 實在是改太多了,改成這副德性我會直接選 kotlin 了。 (當然 lombok 出時 kotlin 也沒個影啦,但現在已經有選擇了)