Devo chiamare sempre super in Java? [duplicare]

0

Considerazioni anti-pattern a parte, dovrei sempre chiamare super in Java quando sovrascrivi i metodi, anche quando il metodo è vuoto?

Dai un'occhiata al codice qui sotto, questo è un estratto da AsyncTask e può essere trovato qui . AsyncTask s sono spesso usati in Android e l'unico metodo che dobbiamo implementare è l'abstract doInBackground() . Altri metodi, come onPreExecute() e onPostExecute() , sono utili per sovrascrivere in alcuni casi. Nota che questi due metodi sono implementati ma in realtà non fanno nulla, cioè sono vuoti.

Ho visto affermazioni che, poiché sono vuote, non dobbiamo ignorarle. Lo faccio ancora perché non so se lo cambieranno in un'implementazione futura (e perché l'editor lo fa per me). Esiste una best practice per questo caso?

/**
* Override this method to perform a computation on a background thread. The
* specified parameters are the parameters passed to {@link #execute}
* by the caller of this task.
*
* This method can call {@link #publishProgress} to publish updates
* on the UI thread.
*
* @param params The parameters of the task.
*
* @return A result, defined by the subclass of this task.
*
* @see #onPreExecute()
* @see #onPostExecute
* @see #publishProgress
*/
protected abstract Result doInBackground(Params... params);

/**
* Runs on the UI thread before {@link #doInBackground}.
*
* @see #onPostExecute
* @see #doInBackground
*/
protected void onPreExecute() {
}

/**
* <p>Runs on the UI thread after {@link #doInBackground}. The
* specified result is the value returned by {@link #doInBackground}.</p>
*
* <p>This method won't be invoked if the task was cancelled.</p>
*
* @param result The result of the operation computed by {@link #doInBackground}.
*
* @see #onPreExecute
* @see #doInBackground
* @see #onCancelled(Object)
*/
@SuppressWarnings({"UnusedDeclaration"})
protected void onPostExecute(Result result) {
}
    
posta Daniel 31.03.2015 - 14:16
fonte

1 risposta

6

I still do because I do not know whether they'll change it in a future implementation (and because the editor does it for me).

Una superclasse che fa questa è una brutta superclasse. La superclasse ha bisogno di dirti esattamente quale sia la sua implementazione (se esiste) del metodo non- final , in quali circostanze verrà chiamata da altri metodi della superclasse e cosa devi fare per sovrascriverla correttamente.

Una volta specificate queste cose, non può tornare su di esse. Proprio come è necessario mantenere la retrocompatibilità dei metodi public , le superclassi devono mantenere la retrocompatibilità delle modifiche ai metodi ereditabili o tutte le interruzioni dell'inferno.

    
risposta data 31.03.2015 - 14:28
fonte

Leggi altre domande sui tag