Java Puzzlers: 38.The Unwelcome Guest
下面這段程式碼有沒有問題呢?
結果:這隻程式看似正常,實際上卻無法編譯!
這是因為要利用電腦來要判斷blank final是否在程式中被設定超過一次是極為困難的,
Java編譯器使用的規則是『blank final只有在"當然"未被設定時,才能被設定』。
問題就是只能歸咎於,編譯器的演算法還不夠完善,
Java為了安全起見,要求我們必須修改這個不夠安全的程式碼。
public class UnwelcomeGuest {
public static final long GUEST_USER_ID = -1;
private static final long USER_ID;
static {
try {
USER_ID = getUserIdFromEnvironment();
} catch (IdUnavailableException e) {
USER_ID = GUEST_USER_ID;
System.out.println("Logging in as guest");
}
}
private static long getUserIdFromEnvironment()
throws IdUnavailableException {
throws new IdUnavailableException ();
}
public static void main(String[] args) {
System.out.println("User ID: " + USER_ID);
}
}
class IdUnavailableException extends Exception {
IdUnavailableException() {
}
}
結果:這隻程式看似正常,實際上卻無法編譯!
這是因為要利用電腦來要判斷blank final是否在程式中被設定超過一次是極為困難的,
Java編譯器使用的規則是『blank final只有在"當然"未被設定時,才能被設定』。
問題就是只能歸咎於,編譯器的演算法還不夠完善,
Java為了安全起見,要求我們必須修改這個不夠安全的程式碼。
留言