<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                ### [終結條件](https://lingcoder.gitee.io/onjava8/#/book/06-Housekeeping?id=%e7%bb%88%e7%bb%93%e6%9d%a1%e4%bb%b6) 通常,不能指望`finalize()`,你必須創建其他的"清理"方法,并明確地調用它們。所以看起來,`finalize()`只對大部分程序員很難用到的一些晦澀內存清理里有用了。但是,`finalize()`還有一個有趣的用法,它不依賴于每次都要對`finalize()`進行調用,這就是對象終結條件的驗證。 當對某個對象不感興趣時——也就是它將被清理了,這個對象應該處于某種狀態,這種狀態下它占用的內存可以被安全地釋放掉。例如,如果對象代表了一個打開的文件,在對象被垃圾回收之前程序員應該關閉這個文件。只要對象中存在沒有被適當清理的部分,程序就存在很隱晦的 bug。`finalize()`可以用來最終發現這個情況,盡管它并不總是被調用。如果某次`finalize()`的動作使得 bug 被發現,那么就可以據此找出問題所在——這才是人們真正關心的。以下是個簡單的例子,示范了`finalize()`的可能使用方式: ~~~ // housekeeping/TerminationCondition.java // Using finalize() to detect a object that // hasn't been properly cleaned up import onjava.*; class Book { boolean checkedOut = false; Book(boolean checkOut) { checkedOut = checkOut; } void checkIn() { checkedOut = false; } @Override protected void finalize() throws Throwable { if (checkedOut) { System.out.println("Error: checked out"); } // Normally, you'll also do this: // super.finalize(); // Call the base-class version } } public class TerminationCondition { public static void main(String[] args) { Book novel = new Book(true); // Proper cleanup: novel.checkIn(); // Drop the reference, forget to clean up: new Book(true); // Force garbage collection & finalization: System.gc(); new Nap(1); // One second delay } } ~~~ 輸出: ~~~ Error: checked out ~~~ 本例的終結條件是:所有的**Book**對象在被垃圾回收之前必須被登記。但在`main()`方法中,有一本書沒有登記。要是沒有`finalize()`方法來驗證終結條件,將會很難發現這個 bug。 你可能注意到使用了`@Override`。`@`意味著這是一個注解,注解是關于代碼的額外信息。在這里,該注解告訴編譯器這不是偶然地重定義在每個對象中都存在的`finalize()`方法——程序員知道自己在做什么。編譯器確保你沒有拼錯方法名,而且確保那個方法存在于基類中。注解也是對讀者的提醒,`@Override`在 Java 5 引入,在 Java 7 中改善,本書通篇會出現。 注意,`System.gc()`用于強制進行終結動作。但是即使不這么做,只要重復地執行程序(假設程序將分配大量的存儲空間而導致垃圾回收動作的執行),最終也能找出錯誤的**Book**對象。 你應該總是假設基類版本的`finalize()`也要做一些重要的事情,使用**super**調用它,就像在`Book.finalize()`中看到的那樣。本例中,它被注釋掉了,因為它需要進行異常處理,而我們到現在還沒有涉及到。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看