it-swarm-eu.dev

Kdy používáte anotaci @Override jazyka Java a proč?

Jaké jsou nejlepší postupy pro použití anotace @Override v jazyce Java a proč?

Zdá se, že by bylo přehnané označit každou jednotlivou metodu anotací @Override. Existují určité programovací situace, které vyžadují použití @Override a dalších, které by nikdy neměly používat @Override?

498
Alex B

Použijte jej pokaždé, když přepíšete metodu pro dvě výhody. Udělejte to tak, abyste mohli využít kontrolu kompilátoru, abyste se ujistili, že jste skutečně přepsali metodu, když si myslíte, že jste. Tímto způsobem, pokud uděláte společnou chybu chybného označení názvu metody nebo nesprávného přiřazení parametrů, budete upozorněni, že metoda ve skutečnosti nepřekoná, jak si myslíte. Za druhé usnadňuje pochopení kódu, protože je více zřejmé, když jsou metody přepsány.

Navíc v jazyce Java 1.6 jej můžete použít k označení, kdy metoda implementuje rozhraní pro stejné výhody. Myslím, že by bylo lepší mít samostatnou anotaci (jako @Implements), ale je to lepší než nic.

515
Dave L.

Myslím si, že je nejužitečnější připomenout, že cílem metody je přepsat rodičovskou metodu. Jako příklad:

protected boolean displaySensitiveInformation() {
  return false;
}

Často se zobrazí něco jako výše uvedená metoda, která potlačí metodu v základní třídě. Jedná se o důležitý implementační detail této třídy - nechceme, aby se zobrazovaly citlivé informace.

Předpokládejme, že tato metoda je změněna v nadřazené třídě na

protected boolean displaySensitiveInformation(Context context) {
  return true;
}

Tato změna nezpůsobí žádné chyby kompilace ani varování - ale zcela změní zamýšlené chování podtřídy.

Chcete-li odpovědět na svou otázku: měli byste použít anotaci @Override, pokud nedostatek metody se stejným podpisem v nadtřídě indikuje chybu.

110
jon

Existuje mnoho dobrých odpovědí, takže mi dovolte nabídnout další způsob, jak se na to podívat ...

Pokud kódujete, neexistuje žádná přehnanost. To vás nestojí nic za typ @override, ale úspory mohou být obrovské, pokud jste chybně název metody, nebo dostal podpis mírně špatně.

Přemýšlejte o tom tímto způsobem: V době, kdy jste sem navigovali a zadali tento příspěvek, jste do značné míry využili více času, než byste strávili psaním @override po zbytek svého života; ale jedna chyba brání vám ušetří hodiny.

Java dělá vše, co je v jeho silách, aby se ujistila, že jste při úpravě/kompilaci neudělali žádné chyby, což je prakticky volný způsob, jak vyřešit celou třídu chyb, kterým se nedá zabránit žádným jiným způsobem mimo komplexní testování.

Můžete přijít s lepším mechanismem v Javě, abyste zajistili, že když uživatel zamýšlí přepsat metodu, skutečně to udělal?

Dalším úhledným efektem je, že pokud tuto anotaci neposkytnete, bude vás upozorňovat při kompilaci, že jste omylem překonali rodičovskou metodu - něco, co by mohlo být významné, kdybyste to nechtěli udělat.

46
Bill K

Vždy používám značku. Je to jednoduchá vlajka kompilace, abych zachytil malé chyby, které bych mohl udělat.

Bude to chytit věci jako tostring() namísto toString()

Malé věci pomáhají ve velkých projektech.

22
jjnguy

Použití anotace @Override funguje jako ochrana proti kompilaci před běžnou chybou programování. Bude-li mít anotaci na metodě, kterou ve skutečnosti nepředepisujete metodu nadtřídy, hodí se chyba kompilace.

Nejběžnější případ, kdy je to užitečné, je, když měníte metodu v základní třídě tak, aby měla jiný seznam parametrů. Metoda v podtřídě, která se používá k přepsání metody nadtřídy, tak již nebude dělat kvůli změněné metodě podpisu. To může někdy způsobit podivné a neočekávané chování, zejména při řešení složitých struktur dědičnosti. Anotace @Override chrání proti tomuto.

18
toluju

Chcete-li využít kontroly kompilátoru, měli byste vždy použít poznámku Override. Nezapomeňte však, že Java Compiler 1.5 neumožňuje tuto anotaci při přepsání metod rozhraní. Stačí jej použít k přepsání metod třídy (abstraktní nebo ne).

Některé IDE, jako Eclipse, dokonce konfigurované s Java 1.6 runtime nebo vyšším, zachovávají shodu s Java 1.5 a nedovolují použití @override, jak je popsáno výše. Abyste se tomuto chování vyhnuli, musíte přejít na: Vlastnosti projektu -> Java Compiler -> Zaškrtněte „Povolit nastavení specifická pro projekt“ -> Zvolte „Kompilační úroveň kompilátoru“ = 6,0 nebo vyšší.

Líbí se mi použít tuto anotaci pokaždé, když přepíšu metodu nezávisle, pokud je základem rozhraní nebo třída.

To vám pomůže vyhnout se některým typickým chybám, jako když přemýšlíte, že přepíšete obslužnou rutinu událostí, a pak se nic neděje. Představte si, že chcete přidat posluchače událostí do některé součásti uživatelského rozhraní:

someUIComponent.addMouseListener(new MouseAdapter(){
  public void mouseEntered() {
     ...do something...
  }
});

Výše uvedený kód zkompilovává a spouští, ale pokud přesunete myš uvnitř nějakého prvku, kód „udělat něco“ se spustí, protože ve skutečnosti nepředepisujete základní metodu mouseEntered(MouseEvent ev). Stačí vytvořit novou metodu bez parametru mouseEntered(). Namísto tohoto kódu, pokud jste použili anotaci @Override, viděli jste chybu kompilace a vy jste neztráceli čas přemýšlením, proč vaše obsluha událostí nebyla spuštěna.

14
user174340

Jeho nejlepší je použít pro každou metodu určenou jako přepsání a Java 6+, každou metodu určenou jako implementace rozhraní.

Za prvé, to zachytí překlepy jako "hashcode()" místo "hashCode()" v době kompilace. To může být zmatené ladění, proč výsledek vaší metody se nezdá, aby odpovídal vašemu kódu, když skutečnou příčinou je, že kód není nikdy vyvolán.

Také pokud superclass změní signaturu metody, přepsání staršího podpisu může být "orphaned", zanechané jako matoucí mrtvý kód. Anotace @Override vám pomůže identifikovat tyto sirotky tak, aby mohly být upraveny tak, aby odpovídaly novému podpisu.

8
erickson

@ Override na implementace rozhraní je nekonzistentní, protože neexistuje žádná taková věc jako "přepsání rozhraní" v Javě.

@ Override na implementace rozhraní je k ničemu, protože v praxi to nebere žádné chyby, které by kompilace stejně nechytila. Existuje pouze jeden scénář s daleko načteným scénářem, kdy přepsání implementátorů ve skutečnosti něco dělá: Pokud implementujete rozhraní a metody REMOVES rozhraní, budete upozorněni na dobu kompilace, kterou byste měli odstranit nepoužívané implementace. Všimněte si, že pokud má nová verze rozhraní NOVÉ nebo ZMĚNĚNÉ metody, pochopitelně dostanete chybu kompilace, stejně jako neprovedete nové věci.

@Override na implementátorech rozhraní by nikdy nemělo být povoleno v 1.6 a Eclipse se smutně rozhodl automaticky vkládat anotace jako výchozí chování, dostáváme spoustu přeplněných zdrojových souborů. Při čtení kódu 1.6 nelze z anotace @Override vidět, pokud metoda skutečně přepíše metodu v nadtřídě nebo pouze implementuje rozhraní.

Použití @Override když vlastně přepíše metodu v nadtřídě je v pořádku.

8
Rune

Další věc, kterou dělá, je, že je více zřejmé při čtení kódu, že mění chování mateřské třídy. Pak může pomoci při ladění.

Také v knize Joshua Block Effective Java (2. vydání), položka 36 uvádí více podrobností o výhodách anotace.

7
Diastrophism

@Override na rozhraní skutečně užitečné, protože budete mít varování, pokud změníte rozhraní.

7
Asgeir S. Nilsen

Pokud se ocitnete nadřazené (non-abstract) metody velmi často, budete pravděpodobně chtít podívat na svůj design. Je to velmi užitečné, když kompilátor chybu nezachytí. Například pokus o přepsání initValue () v ThreadLocal, který jsem udělal.

Použití aplikace @Override při implementaci metod rozhraní (funkce 1.6+) se mi zdá trochu přehnané. Pokud máte spoustu metod, z nichž některé přepíší a některé ne, ten pravděpodobně špatný design znovu (a váš editor pravděpodobně ukáže, který je který, pokud nevíte).

7

Při implementaci metody rozhraní nemá smysl používat @Override. V tomto případě není výhoda použití - kompilátor už zachytí vaši chybu, takže je to prostě zbytečný nepořádek.

6
Steve R.

Kdykoli metoda přepíše jinou metodu, nebo metoda implementuje podpis v rozhraní.

Anotace @Override vás ujišťuje, že jste ve skutečnosti něco přepsali. Bez anotace riskujete pravopisné chyby nebo rozdíly v typech a číslech parametrů.

6
Greg Mattes
  • Používá se pouze na prohlášení o metodě.
  • Označuje, že deklarace anotované metody přepíše deklaraci v supertypu.

Pokud se používá konzistentně, chrání vás před velkou třídou hanebných chyb.

Chcete-li se těmto chybám vyhnout, použijte @Override anotaci: (Místo chyby zadejte následující kód :)

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<Bigram>();
        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());
    }
}

zdroj: Efektivní Java

5
jai

Používám ji pokaždé. Je to více informací, které mohu použít, abych rychle zjistil, co se děje, když jsem se o rok vrátil do kódu a zapomněl jsem, co jsem poprvé myslel.

5
Hank Gay

Používám ji všude. Na téma úsilí o značení metod, jsem Eclipse to udělal pro mě, takže to není další úsilí.

Jsem náboženský o neustálém refaktoringu .... tak, abych to udělala hladce, využiji každou malou věc.

5
willCode4Beer

Nejlepším způsobem je vždy použít (nebo mít IDE pro vás)

@ Použitelnost override je detekovat změny ve třídách rodičů, které nebyly hlášeny v hierarchii. Bez ní můžete změnit metodu podpisu a zapomenout na změnu jeho přepsání, s @ Override, kompilátor ho chytí za vás.

Taková bezpečnostní síť je vždy dobré mít.

5
David Pierre

Buďte opatrní, když používáte Override, protože poté nemůžete dělat zpětný inženýr v starUML poté; první uml.

3
Horatiu Jeflea

Zdá se, že moudrost se mění. Dnes jsem nainstaloval IntelliJ IDEA 9 a všiml jsem si, že jeho " chybějící kontrola @Override " nyní chytí nejen implementované abstraktní metody, ale také implementované metody rozhraní. V kódovém základu mého zaměstnavatele a v mých vlastních projektech jsem si už dlouho zvykl používat pouze @Override pro dřívější - implementované abstraktní metody. Nicméně přehodnocení zvyku, zásluha použití anotací v obou případech se stává jasným. Navzdory tomu, že je podrobnější, chrání proti křehké základní třídě problém (ne jako Grave jako příklady související s C++), kde se mění název metody rozhraní, což znamená, že osamocená metoda by mohla být implementována v odvozené třídě.

Samozřejmě, tento scénář je většinou hyperbole; odvozená třída by již kompilace, nyní chybí implementace metody přejmenované rozhraní, a dnes by pravděpodobně použít Rename Metoda refactoring operace adresovat celý kód základny en masse.

Vzhledem k tomu, že inspekce IDEA není konfigurovatelná k tomu, aby ignorovala implementované metody rozhraní, dnes změním jak můj zvyk, tak kritéria pro kontrolu kódu týmu.

2
seh

Anotace @Override slouží k ověření, zda vývojář přepíše správnou metodu v nadřazené třídě nebo rozhraní. Když se mění název metody super, kompilátor může tento případ upozornit, což je pouze pro zachování konzistence se super a podtřídou.

BTW, pokud jsme v podtřídě neoznámili anotaci @ Override, ale přepíšeme některé metody super, pak funkce může fungovat jako ta s @ Override. Tato metoda však nemůže oznámit vývojáři, když byla změněna metoda super. Protože neznala záměr vývojáře - přepsat super metodu nebo definovat novou metodu?

Když tedy chceme tuto metodu potlačit, abychom mohli využít Polymorfismus, měli bychom přidat metodu Override nad tuto metodu.

2
lzlstyle

Používám ho co nejvíce, abych zjistil, kdy je metoda přepsána. Pokud se podíváte na programovací jazyk Scala, mají také klíčové slovo override. Považuji to za užitečné.

1
Berlin Brown

myslím, že je nejlepší kód @override kdykoliv povolit. pomáhá při kódování. Všimněte si však, že pro ecipse Helios, buď sdk 5 nebo 6, je povolena anotace @override pro implementované metody rozhraní. jako u programu Galileo, buď 5 nebo 6, není anotace @override povolena.

0
lwpro2

Pro mě mě zajímá @ Override, že mám správný podpis metody. Pokud vložím anotaci a metoda není správně napsána, kompilátor si stěžuje, že mi dalo vědět, že je něco špatně.

0
Dale

Jednoduchý - chcete-li přepsat metodu přítomnou ve vaší nadtřídě, použijte anotaci @Override k provedení správného přepsání. Kompilátor vás bude varovat, pokud ho nepřehlásíte správně.

0
Sree

To vám umožní (dobře, kompilátor) chytit, když jste použili nesprávný pravopis na název metody, které jste přepsání.

0
JeeBee

Anotace přepsání se používá k využití kompilátoru pro kontrolu, zda skutečně přepsáváte metodu z nadřazené třídy. Používá se k upozornění, pokud uděláte jakoukoli chybu, jako je omyl při chybném názvu metody, chyba při nesprávném přiřazení parametrů

0
Siva

Anotace poskytují metadata o kódu pro kompilátor a anotace @ Override se používá v případě dědičnosti, když převažujeme nad jakoukoliv metodou základní třídy. To jen řekne kompilátoru že vy jste nadřazený metoda. Dokáže se vyhnout některým běžným chybám, které můžeme udělat, jako bychom se nemuseli řídit řádným podpisem metody nebo mispellingem v názvu metody atd. Takže je to dobrý postup pro použití anotace @ Override.

0
gprathour