<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>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                ## Chapter 6. Enums and Annotations(枚舉和注解) ### Item 40: Consistently use the Override annotation(堅持使用 @Override 注解) The Java libraries contain several annotation types. For the typical programmer, the most important of these is @Override. This annotation can be used only on method declarations, and it indicates that the annotated method declaration overrides a declaration in a supertype. If you consistently use this annotation, it will protect you from a large class of nefarious bugs. Consider this program, in which the class Bigram represents a bigram, or ordered pair of letters: Java 庫包含幾種注解類型。對于大多數的程序員來說,其中最重要的是 `@Override`。此注解只能在方法聲明上使用,帶有該注解的方法聲明將覆蓋超類型中的聲明。如果你堅持使用這個注解,它將幫助你減少受到有害錯誤的影響。考慮這個程序,其中類 Bigram 表示一個二元語法,或有序的字母對: ``` // Can you spot the bug? public class Bigram { private final char first; private final char second; public Bigram(char first, char second) { this.first = first; this.second = second; } public boolean equals(Bigram b) { return b.first == first && b.second == second; } public int hashCode() { return 31 * first + second; } public static void main(String[] args) { Set<Bigram> s = new HashSet<>(); for (int i = 0; i < 10; i++) for (char ch = 'a'; ch <= 'z'; ch++) s.add(new Bigram(ch, ch)); System.out.println(s.size()); } } ``` The main program repeatedly adds twenty-six bigrams, each consisting of two identical lowercase letters, to a set. Then it prints the size of the set. You might expect the program to print 26, as sets cannot contain duplicates. If you try running the program, you’ll find that it prints not 26 but 260. What is wrong with it? 主程序重復地向一個集合中添加 26 個 bigram,每個 bigram 由兩個相同的小寫字母組成。然后它打印該集合的大小。如果你嘗試運行該程序,你會發現它打印的不是 26 而是 260。有什么問題嗎? Clearly, the author of the Bigram class intended to override the equals method (Item 10) and even remembered to override hashCode in tandem (Item 11). Unfortunately, our hapless programmer failed to override equals, overloading it instead (Item 52). To override Object.equals, you must define an equals method whose parameter is of type Object, but the parameter of Bigram’s equals method is not of type Object, so Bigram inherits the equals method from Object. This equals method tests for object identity, just like the == operator. Each of the ten copies of each bigram is distinct from the other nine, so they are deemed unequal by Object.equals, which explains why the program prints 260. 顯然,Bigram 類的作者打算覆蓋 equals 方法([Item-10](/Chapter-3/Chapter-3-Item-10-Obey-the-general-contract-when-overriding-equals.md)),甚至還記得要一并覆蓋 hashCode([Item-11](/Chapter-3/Chapter-3-Item-11-Always-override-hashCode-when-you-override-equals.md))。不幸的是,我們的程序員沒有覆蓋 equals,而是重載了它([Item-52](/Chapter-8/Chapter-8-Item-52-Use-overloading-judiciously.md))。要覆蓋 `Object.equals`,你必須定義一個 equals 方法,它的參數是 Object 類型的,但是 Bigram 的 equals 方法的參數不是 Object 類型的,所以 Bigram 從 Object 繼承 equals 方法。這個繼承來的 equals 方法只能檢測對象同一性,就像 == 操作符一樣。每 10 個 bigram 副本為一組,每組中的每個 bigram 副本都不同于其他 9 個,因此 `Object.equals` 認為它們不相等,這就解釋了為什么程序最終打印 260。 Luckily, the compiler can help you find this error, but only if you help it by telling it that you intend to override Object.equals. To do this, annotate Bigram.equals with @Override, as shown here: 幸運的是,編譯器可以幫助你找到這個錯誤,但前提是你告訴它你打算覆蓋 `Object.equals`。為此,請使用 `@Override` 注解標記 `Bigram.equals`,如下所示: ``` @Override public boolean equals(Bigram b) { return b.first == first && b.second == second; } ``` If you insert this annotation and try to recompile the program, the compiler will generate an error message like this: 如果你插入此注解并嘗試重新編譯程序,編譯器將生成如下錯誤消息: ``` Bigram.java:10: method does not override or implement a method from a supertype @Override public boolean equals(Bigram b) { ^ ``` You will immediately realize what you did wrong, slap yourself on the forehead, and replace the broken equals implementation with a correct one (Item 10): 你會立刻意識到自己做錯了什么,拍拍自己的額頭,用正確的方式替換不正確的 equals 實現([Item-10](/Chapter-3/Chapter-3-Item-10-Obey-the-general-contract-when-overriding-equals.md)): ``` @Override public boolean equals(Object o) { if (!(o instanceof Bigram)) return false; Bigram b = (Bigram) o; return b.first == first && b.second == second; } ``` Therefore, you should **use the Override annotation on every method declaration that you believe to override a superclass declaration.** There is one minor exception to this rule. If you are writing a class that is not labeled abstract and you believe that it overrides an abstract method in its superclass, you needn’t bother putting the Override annotation on that method. In a class that is not declared abstract, the compiler will emit an error message if you fail to override an abstract superclass method. However, you might wish to draw attention to all of the methods in your class that override superclass methods, in which case you should feel free to annotate these methods too. Most IDEs can be set to insert Override annotations automatically when you elect to override a method. 因此,你應該在 **要覆蓋超類聲明的每個方法聲明上使用 @Override 注解。** 這條規則有一個小小的例外。如果你正在編寫一個沒有標記為 abstract 的類,并且你認為它覆蓋了其超類中的抽象方法,那么你不必費心在這些方法上添加 `@Override` 注解。在未聲明為抽象的類中,如果未能覆蓋抽象超類方法,編譯器將發出錯誤消息。但是,你可能希望讓類中覆蓋超類方法的所有方法更加引人注目,在這種情況下,你也可以自由選擇是否注解這些方法。大多數 IDE 都可以設置為在選擇覆蓋方法時自動插入覆蓋注解。 Most IDEs provide another reason to use the Override annotation consistently. If you enable the appropriate check, the IDE will generate a warning if you have a method that doesn’t have an Override annotation but does override a superclass method. If you use the Override annotation consistently, these warnings will alert you to unintentional overriding. They complement the compiler’s error messages, which alert you to unintentional failure to override. Between the IDE and the compiler, you can be sure that you’re overriding methods everywhere you want to and nowhere else. 大多數 IDE 都提供了一致使用 `@Override` 注解的另一個原因。如果啟用適當的檢查,如果你的方法沒有 `@Override` 注解,但確實覆蓋了超類方法,IDE 將生成警告。如果你一致地使用 `@Override` 注解,這些警告將提醒你防止意外覆蓋。它們補充編譯器的錯誤消息,這些錯誤消息會警告你無意的覆蓋錯誤。在 IDE 和編譯器的幫助下,你可以確保在任何你想要實施覆蓋的地方都覆蓋了,而沒有遺漏。 The Override annotation may be used on method declarations that override declarations from interfaces as well as classes. With the advent of default methods, it is good practice to use Override on concrete implementations of interface methods to ensure that the signature is correct. If you know that an interface does not have default methods, you may choose to omit Override annotations on concrete implementations of interface methods to reduce clutter. `@Override` 注解可用于覆蓋接口和類聲明的方法聲明。隨著默認方法的出現,最好對接口方法的具體實現使用 `@Override` 來確保簽名是正確的。如果你知道接口沒有默認方法,你可以選擇忽略接口方法的具體實現上的 `@Override` 注解,以減少混亂。 In an abstract class or an interface, however, it is worth annotating all methods that you believe to override superclass or superinterface methods, whether concrete or abstract. For example, the Set interface adds no new methods to the Collection interface, so it should include Override annotations on all of its method declarations to ensure that it does not accidentally add any new methods to the Collection interface. 然而,在抽象類或接口中,標記覆蓋超類或超接口方法的所有方法是值得的,無論是具體的還是抽象的。例如,Set 接口不會向 Collection 接口添加任何新方法,因此它的所有方法聲明的應該包含 `@Override` 注解,以確保它不會意外地向 Collection 接口添加任何新方法。 In summary, the compiler can protect you from a great many errors if you use the Override annotation on every method declaration that you believe to override a supertype declaration, with one exception. In concrete classes, you need not annotate methods that you believe to override abstract method declarations (though it is not harmful to do so). 總之,如果你在每個方法聲明上都使用 `@Override` 注解來覆蓋超類型聲明(只有一個例外),那么編譯器可以幫助你減少受到有害錯誤的影響。在具體類中,可以不對覆蓋抽象方法聲明的方法使用該注解(即使這么做也并不會有害)。 --- **[Back to contents of the chapter(返回章節目錄)](/Chapter-6/Chapter-6-Introduction.md)** - **Previous Item(上一條目):[Item 39: Prefer annotations to naming patterns(注解優于命名模式)](/Chapter-6/Chapter-6-Item-39-Prefer-annotations-to-naming-patterns.md)** - **Next Item(下一條目):[Item 41: Use marker interfaces to define types(使用標記接口定義類型)](/Chapter-6/Chapter-6-Item-41-Use-marker-interfaces-to-define-types.md)**
                  <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>

                              哎呀哎呀视频在线观看