L'annotazione @Override di Java è ancora buona pratica in questi tempi moderni?

2

Quando l'annotazione @ Override è stata introdotta in Java 1.5, che risale ai tempi in cui i dinosauri vagavano per la Terra, era una buona idea in quel momento perché, tra gli altri vantaggi, ha reso il tuo codice auto-documentante e ha assicurato che hai digitato correttamente il metodo.

Ora è il 2018 e quasi tutti scrivono Java usando un IDE che ti dice già se un metodo è un override, tipicamente usando una piccola icona accanto al nome del metodo o nel margine sinistro della stessa linea. Se ho sbagliato a scrivere il metodo, Java non compilerà la mia classe perché ci sarà un metodo di interfaccia non implementato, e non vedrò la piccola icona prevista, quindi saprò che non è un metodo di sovrascrittura. Mi sembra che l'annotazione @ Override più spesso ingombra il codice piuttosto che documentarlo o renderlo più chiaro. Tuttavia lo uso ancora per coerenza con la base di codice esistente. Ma per un nuovo progetto, pensi davvero che dovremmo ancora usare l'annotazione @ Override? Se sì, perché?

    
posta DodgyCodeException 02.07.2018 - 17:41
fonte

2 risposte

9

Le persone hanno utilizzato gli IDE per scrivere codice Java quasi fintanto che Java è stato un linguaggio mainstream. NetBeans, Eclipse e IntelliJ IDEA esistevano tutti molto prima di Java 1.5. Le persone hanno commesso degli errori e continuano a commettere errori.

La linea di fondo è che qualsiasi cosa tu possa fare per minimizzare quegli errori, in particolare quando sono relativamente a basso costo, lo devi a te stesso.

Un errore più comune di un semplice errore di ortografia nel nome di un metodo sta rimuovendo un metodo da una classe base senza pensare alle conseguenze.

Esempio (prima della modifica):

class Vehicle {
    public void drive() {}
}

class Car {
    @Override
    public void drive() {}
}

Dopo un po ', le persone che stavano mantenendo la classe Vehicle decidono che guidare non dovrebbe essere qualcosa che fa un veicolo, ma qualcosa che fa un autista. Quindi prendono la logica da Vehicle.drive() e la spostano in Driver.drive(Vehicle vehicle) .

Ora inizi a vedere il valore del metodo @Override . Non appena la squadra ha fatto ciò e ricompilato, dovrebbero scoprire tutti i posti che devono essere modificati, o almeno devono essere presi in considerazione nella classe Driver . Senza l'attributo @Override , tutte le sottoclassi si compilerebbero in modo silenzioso e si troverebbero bug sottili che ora dovevi elaborare. In questo esempio Cars non guiderà come una macchina, ma come farebbe un driver generico.

    
risposta data 02.07.2018 - 18:24
fonte
3

Se annoti un metodo con @Override e in realtà non sovrascrive un metodo, il compilatore genererà un'eccezione. Questo potrebbe essere utile ad esempio per individuare un refuso nel nome del metodo.

class Vehicle
{
  public drive()
  {
    //Drive Logic for vehicle
  }
}

class Car extends Vehicle
{
  @Override
  public driev()
  {
    //Drive logic for car
  }
}

Questo genererà un errore di compilazione che potrebbe essere utile per individuare l'errore in precedenza.

    
risposta data 02.07.2018 - 17:45
fonte

Leggi altre domande sui tag