簡體   English   中英

為什么在 try-with-resources 語句之外聲明的資源需要在 java 中是 final 或有效 final?

[英]why resources declared outside the try-with-resources statement need to be final or effectively final in java?

為什么在 try-with-resources 語句之外聲明的資源需要在 java 中是 final 或有效 final? 例如:為什么下面代碼中的 object_name 需要是最終的或有效的最終的?

type object_name = new type();
try (object_name) {
  ...
}

這只是一個下意識的默認設置(一個好的):當有疑問並且沒有特別好的理由允許一些看起來沒有多大意義的奇怪用法時,只是......不要允許它。 如果事實證明因為不允許而損失了很多,那么您可以稍后再允許它。 你不能做相反的事情 - 以后不允許它是向后不兼容的。

這里的具體推理很可能是這個簡單的概念:

你在這里“嘗試”的東西是什么? 是 [A] 變量還是 [B] 對象? 想象一下這段代碼:

class DummyClosable implements AutoClosable {
  String print;

  DummyClosable(String print) {
    this.print = print;
  }

  @Override public void close() {
    System.out.println(print);
  }
}

class Example {
  public static void main(String[] args) {
    DummyClosable dc = new DummyClosable("a");
    try (dc) {
      dc = new DummyClosable("b");
    }
  }
}

那是打印'a'還是'b'? 我可以看到有人完全相信它應該打印'a',我可以看到有人完全相信它應該打印'b'。

但我尤其能看到絕大多數 Java 程序員如何很快發現它會打印一個或另一個,但不確定它是哪一個。 因為嘗試自動關閉非決賽非常罕見,他們沒有經驗,因此大多只會詛咒代碼:他們現在需要猜測它的作用,或者嘗試從上下文中找出它嚴重的懲罰是這會使任何錯誤永久存在,或者需要時間的實驗/閱讀文檔。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM