10
votes

Quels sont les avantages de l'utilisation de la notation @depecated sur l'interface uniquement?

Pour la programmation Java, quels sont des avantages d'utiliser la méthode @deprécated sur la méthode et la méthode d'interface, mais pas sur la classe qui le met en œuvre?

public interface Joe {

    @Deprecated
    public void doSomething();

    ...
}

public final class Joseph implements Joe {

    public void doSomething() {
       ...
    }

    ...
}


2 commentaires

Pourquoi voudriez-vous même déprécier la méthode de l'only dans une interface quand même? Il suffit de mettre dans votre libellé docs que "l'interface" Joe 'n'est pas utilisée pour être utilisée. " ou quelque chose.


Il existe d'autres méthodes pour l'interface et la classe. Désolé Zack pour la confusion.


4 Réponses :


6
votes

À mon avis, il est controversé : une interface de méthode obsolète ne doit pas ne pas être utilisé indépendamment de sa mise en œuvre (veuillez fournir des contre-échantillons sinon)


8 commentaires

J'irais plus loin que controversé: je dirais que c'est discutable. Je demanderais certainement qu'il soit justifié d'un examen de code.


Pourquoi pas? Cela signifie simplement qu'une méthode de l'interface multi-méthodes est prévue pour être supprimée dans les prochains versions.


@Eugene: Cela peut être vrai, mais l'exemple n'a montré qu'une méthode. Alors, pourquoi même avoir cette interface si elle n'a qu'une méthode? :/ MDR


@Eugene: Parfois, une interface est utilisée comme marqueur et ne contient aucune méthode, telle que sérialisable. Si Serializable contenait une méthode qui était désormais obsolète, une interface utile et des objets sérialisables devraient toujours mettre en œuvre cette méthode s'ils s'attendent à être compatibles avec tous les anciens clients.


@DFA, @cperkins: une classe doit mettre en œuvre toutes les méthodes de ses interfaces pour la compatibilité avec les clients qui les utilisent; Si l'interface JOE a une utilisation en plus de cette méthode obsolète, la méthode obsolète doit être mise en œuvre.


Une classe doit mise en œuvre de toutes les méthodes, aucune façon :)


@DFA Je voulais mettre en œuvre la méthode correctement, par opposition à un talon qui est un non-op.


Nous utilisons Rhino où les méthodes Java seront appelées par des codes JavaScript côté serveur de serveurs Version. Donc, je ne dois certainement pas supprimer les méthodes de mon interface Java car elles peuvent être appelées par une ancienne version de JavaScript. Donc, je suis simple supprimer la méthode de mon code JavaScript et mettez une @depecated à la méthode d'interface Java.



11
votes

@depecated est la documentation. Si les gens codent dans une interface, vous pouvez marquer certains aspects de cette interface comme obsolète. De cette façon, les gens savent de ne pas l'utiliser.

La classe de mise en œuvre de l'interface est un détail. Une méthode dans cette classe accomplit pour satisfaire l'interface mais ne peut être obsolète par elle-même. Déprécier cette méthode peut ou non être appropriée.

Création d'une nouvelle classe qui implémente une interface signifie que vous devez mettre en œuvre les méthodes obsolètes. Ils devraient probablement travailler à moins que vous sachiez que les clients de la classe n'utilisent pas les méthodes obsolètes. Par exemple, si vous créez un conteneur de servlet HTTP, vous devez implémenter la méthode httpservletresponse.encodurl () même s'il est obsolète en faveur de Encodurl () . C'est parce qu'un utilisateur de votre classe peut appeler cette méthode obsolète.


1 commentaires

En expansion "déprécant que la méthode [mise en œuvre] peut être appropriée ou non." Plus précisément, il se peut que la méthode de l'interface ne soit pas appropriée pour toutes les implémentations de Joe, mais convient à cette mise en œuvre particulière Joseph - Ainsi, la dépréciation de l'interface mais pas dans cette mise en œuvre particulière.



9
votes

Je crois que c'est une lacune dans la langue Java elle-même et elle est absurde de spécifier une méthode dans une interface comme obsolète via une annotation et ne disposant pas de la méthode considérée comme obsolète dans la classe d'exécution.

Il serait préférable que le @ la dépréciation de la méthode était héritée. Malheureusement, il semble que Java ne supporte pas cela.

Examinez comment l'outil, tel qu'un IDE, traite cette situation: si le type d'une variable est déclaré être l'interface, les méthodes @depecated peuvent être rendues avec une grève. Mais si le type d'une variable est déclaré être la classe d'implémentation et que la signature de la classe n'inclut pas @depecated, la méthode sera rendue sans une grève.

La question fondamentale est la suivante: qu'est-ce que cela signifie pour une méthode d'être obsolète dans une interface mais pas dans une classe d'implémentation (ou dans une interface extension)? La seule intention raisonnable est que la méthode d'être obsolète pour tout au-dessous de l'interface de la hiérarchie de la classe. Mais la langue ne supporte pas ce comportement.


0 commentaires

0
votes

Si nous voulons refacturer le code existant avec des méthodes inappropriées dans l'interface et dans la mise en œuvre, nous pouvons utiliser @depecated dans les méthodes d'interface en faveur de nouvelles méthodes propres temporairement à peu de versions. Il peut être moche, juste pour garder le code en arrière compatible, nous pouvons en utiliser. Cela montrera dans le rapport IDE et SONAR que sa méthode obsolète et obligea les clients à utiliser de nouvelles méthodes.


0 commentaires