據我瞭解,Java沒有真正的關閉。你可以通過chaperoning把他們的功能傳遞給一個類;然而,不僅它是冗長的,而且(由於Java的內存模型)匿名類中的任何引用都被定義在構造環境中定義的變量時,它們被傳遞爲副本。該語言鼓勵我們記住這一點,只允許匿名課程參考final
變量。匿名類中的非最終非局部變量
這使我這個代碼片斷我在Bloch的有效的Java發現:
import java.util.concurrent.*;
public class StopThread {
private static boolean stopRequested;
public static void main(String[] args)
throws InterruptedException {
Thread backgroundThread = new Thread(new Runnable() {
public void run() {
int i = 0;
while (!stopRequested)
i++;
}
});
backgroundThread.start();
TimeUnit.SECONDS.sleep(1);
stopRequested = true;
}
}
首先,我希望編譯器抱怨,因爲stopRequested
是非最終,我指的是匿名類中。我的編譯器沒有抱怨。其次,我期望程序能夠永久循環,因爲Java不支持閉包,並且如果匿名類實際上指的是它構建的環境中的實際變量(而不是簡單的拷貝),那麼我們似乎在這裏關閉了。 Joshua Bloch還表示,該程序在他的電腦上永遠循環播放。但是我的跑步一秒鐘後就退出了。
什麼部分的記憶模型是我誤解?
你絕對正確。布洛赫試圖通過一個不相關的概念,但引起我注意的是「什麼?Java已經關閉了???從什麼時候???」 感謝您的支持。那麼看起來Java幾乎已經關閉了?匿名類是從類或對象構造的閉包,但不是在構造函數時閉包? – achow
@ highwind7777:匿名或本地類總是表現相同,幾乎關閉。從上下文來看,局部變量或實例或靜態變量的行爲是不同的:局部變量被複制,因此必須是最終的。實例變量通過對其封閉對象的隱藏引用進行訪問。 –