Java謎題6:雞與蛋-解決方案
如果沒有給出一個(non-null)Chicken,則Eggthrow 的建構函式丟擲 NullPointerException ,反之亦然。那麼您如何獲得對它們中任何一個的引用?
使這成為可能(甚至是偶然發生的)的一個常見缺陷是呼叫一個可以在建構函式的子類中重寫的方法。但事實並非如此。您可以重寫一種方法,使建構函式不呼叫,但是Java最終呼叫:finalize()。該方法在物件被垃圾回收之前被呼叫,以使其有機會清理其資源。即使建構函式丟擲異常,它也會被呼叫,因此透過重寫它,我們可以獲得對未完全建立的egg的引用。
package creator; import chicken.Chicken; import chicken.Egg; public class Creator { static class FirstEgg extends Egg { FirstEgg() { super(null); } @Override protected void finalize() { new Chicken(this).ask(); } } public static void main(String[] args) throws Exception { try { new FirstEgg(); } catch (NullPointerException e) { } // there are ways to force garbage collection harder, // but this works good enough for me System.gc(); System.runFinalization(); Thread.sleep(1000); } } |
眾所周知,終結機制有幾個 問題,還有更好的選擇。在Java的安全編碼標準中,有多種方法可以抵禦這種情況。另一種方法是在從Object類中呼叫建構函式之前引發異常。這意味著在呼叫super()之前執行此工作(或使用this()呼叫另一個建構函式)。從Java 6開始,這保證finalize()不會被呼叫。例如,在呼叫 this(Object)之前,我們先取消對mom.first的引用,以確保在沒有媽媽的情況下無法建立雞蛋:
public class Egg { final Object first; public Egg(Chicken mom) { this(mom.first); } private Egg(Object first) { this.first = first; } } |
相關文章
- Java謎題6:雞與蛋Java
- Java謎題7:餅乾-解決方案Java
- Java謎題1:小丑 - 解決方案Java
- Java謎題3:汽車 - 解決方案Java
- Java謎題5:球(ball)-解決方案Java
- 使用deferred constraint 解決“先有蛋還是先有雞的問題”AI
- 程式設計與雞和蛋的關係 (轉)程式設計
- Java 8 的日期與時間問題解決方案Java
- 微信登入-6問題解決方案
- Java謎題:小丑Java
- 先有雞or先有蛋?淺談資料拆分與特徵縮放的順序問題特徵
- nginx /Java 解決跨域問題方案NginxJava跨域
- Laravel6.X 跨域問題解決方案Laravel跨域
- Java謎題3:汽車Java
- Java™ 教程(常見問題及其解決方案)Java
- 解謎遊戲謎題設計研究(三):推理類謎題設計遊戲
- 解謎遊戲謎題設計研究(一):物品類謎題設計遊戲
- iPhone 6/Plus常見使用問題及解決方案iPhone
- 解謎遊戲謎題設計研究(二):機關類謎題設計遊戲
- Java 謎題 7:餅乾(Cookie)JavaCookie
- Java謎題5:球(ball)Java
- Java 謎題 2:夢境Java
- Java 程式死鎖問題原理及解決方案Java
- JAVA常見中文問題的解決方案(轉)Java
- 在 Linux 命令列中使用 nudoku 解決謎題Linux命令列
- Java亂碼解決方案Java
- 程式設計謎題:提升你解決問題的訓練場程式設計
- java學習中問題與解決方式Java
- 舊專案 TypeScript 改造問題與解決方案記TypeScript
- 跨域問題,解決方案 – CORS方案跨域CORS
- 跨域問題,解決方案 - CORS方案跨域CORS
- ipv6 解決方案 詳細版
- 解決java網路程式設計IPv6問題Java程式設計
- Java限流及常用解決方案Java
- 工作中碰到的Java問題整理及解決方案Java
- Java 謎題4:液體(Liquid)JavaUI
- 木馬問題解決方案
- jive中文問題解決方案