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 雞蛋問題Java
- Java謎題1:小丑 - 解決方案Java
- Java謎題7:餅乾-解決方案Java
- Java謎題5:球(ball)-解決方案Java
- Java謎題3:汽車 - 解決方案Java
- 雞蛋期貨
- Java 8 的日期與時間問題解決方案Java
- 微信登入-6問題解決方案
- google經典演算法面試題-雞蛋問題Go演算法面試題
- nginx /Java 解決跨域問題方案NginxJava跨域
- 平方謎題(6)
- Laravel6.X 跨域問題解決方案Laravel跨域
- 菜譜-韭黃炒雞蛋
- Java™ 教程(常見問題及其解決方案)Java
- 先有雞or先有蛋?淺談資料拆分與特徵縮放的順序問題特徵
- 乘法◆除法◆謎題(6)
- ●六數謎題●(6)
- rvest爬取雞蛋期貨資料(遇到的問題)
- Serverless 2.0,雞蛋還是銀彈?Server
- Java謎題:小丑Java
- 【進階5-3期】深入探究 Function & Object 雞蛋問題FunctionObject
- 掃碼領雞蛋聽靠譜的
- java學習中問題與解決方式Java
- 動態規劃法(六)雞蛋掉落問題(一)(egg dropping problem)動態規劃
- 天王星雲層與臭雞蛋有什麼共同之處?
- 解決java網路程式設計IPv6問題Java程式設計
- Wampserver圖示是橙色的【問題與解決方案】Server
- 舊專案 TypeScript 改造問題與解決方案記TypeScript
- Redis 大key(bigkey)問題的排查與解決方案Redis
- 工作中碰到的Java問題整理及解決方案Java
- Java限流及常用解決方案Java
- 跨域問題,解決方案 – CORS方案跨域CORS
- 在 Linux 命令列中使用 nudoku 解決謎題Linux命令列
- 愛吃雞蛋的人注意了!我國學者最新研究:冠心病高遺傳風險者或應少吃雞蛋,每週增加3個雞蛋冠心病風險增加10%!
- 一篇文章帶你搞定經典面試題之扔雞蛋問題面試題
- Java謎題5:球(ball)Java
- Java 謎題 2:夢境Java