Java: Comment éviter les avertissements obsolètes dans les interfaces dérivées qui remplacent les membres obsolètes?

StackOverflow https://stackoverflow.com/questions/1213362

Question

Considérez la hiérarchie d'héritage d'interface simplifiée suivante:

// Starting point:
public interface Base {
    void Foo();
}

public interface Derived extends Base {
}

Il est prévu de déplacer la méthode Foo de l'interface Base vers l'interface Derived :

// Desired end-point:
public interface Base {
}

public interface Derived extends Base {
    void Foo();
}

Pour intégrer progressivement ce changement radical, il est souhaitable de conserver pendant un certain temps la compatibilité en amont de l'interface Base .

Ceci peut être réalisé en marquant la méthode sur l'interface Base comme @Deprecated :

// Intermediate state:
public interface Base {
    /**
     * @deprecated This method is deprecated as of release X. Derived.Foo should be used instead.
     */
    @Deprecated void Foo();
}

public interface Derived extends Base {
    void Foo(); 
}

Lorsque je compile ce code, un avertissement du compilateur s'affiche pour dérivé :

  

[obsolète] Foo () dans l'interface Base est obsolète

Bizarrement, si je supprime le @deprecated de la documentation dans Base (mais laissez le @Deprecated), cet avertissement disparaît.

Est-il exact que je reçois cet avertissement, et si oui, comment puis-je contourner ce problème?

L'avertissement semble indiquer que Derived.Foo utilise " avec " Base.Foo (obsolète). Mais la seule capacité dans laquelle Derived.Foo est "utilisant" le Base.Foo obsolète doit le remplacer. Cela semble indiquer que vous n'êtes pas autorisé à remplacer les méthodes d'interface déconseillées dans les méthodes dérivées.

Si tel est le cas, devrais-je alors décorer Derived avec @SuppressWarnings ("deprecation") pour supprimer l'avertissement?

Était-ce utile?

La solution

Je pense que votre exigence est valide. Je ne doute pas que le remplacement de la méthode obsolète est la bonne façon de procéder.

Je pense que la différence entre @deprecated et @Deprecated est principalement historique. @Deprecated est la méthode officielle de Java 5, mais elle est nouvelle. Nous devons donc la doubler avec @deprecated.

Notez également que, malheureusement, @Deprecated ne vous permet pas de spécifier des informations .. alors que des informations sont généralement nécessaires, par exemple pour indiquer ce qui doit être utilisé en remplacement ou lorsque la méthode obsolète doit être complètement supprimée .

Ne sachant pas plus et sachant que le problème disparaîtra dès que vous supprimerez la super méthode, j'utiliserais le @SuppressWarnings ("deprecation"), éventuellement avec un commentaire que vos successeurs comprendront ... (et un autre commentaire sur la super méthode pour leur dire de supprimer tout cela lors de la suppression de la méthode). ; -)

Autres conseils

si je comprends bien, vous avez besoin d'un @SuppressWarnings ("deprecation") au début de vos classes qui implémentent l'interface / fonction obsolète. Ou suis-je loin de la base ici?

Si vous ajoutez @Deprecated à votre déclaration dérivée de Foo (), l'avertissement disparaîtra.

public interface Derived extends Base {
    @Deprecated void Foo(); 
}

Il n’ya aucun moyen d’accomplir ce que vous voulez.

La dépréciation est un mécanisme relativement simple et ne prend pas en charge ce cas d'utilisation.

La méthode obsolète fonctionne de manière à ce que tout ce qui fait référence à une méthode ou à un champ obsolète génère un avertissement.

La seule exception est si le code utilisant la méthode / le champ obsolète est lui-même obsolète.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top