49 votes

Anonymous vs nommé classes internes? - les meilleures pratiques?

J'ai une classe, appelons-la LineGraph, traçant un graphique linéaire. J'ai besoin de sous-classe, mais la classe dérivée n'est utilisé que dans un seul endroit et est couplé à la classe qui l'utilise. Donc je suis en utilisant un intérieur de classe.

Je vois deux façons de le faire:

Anonyme intérieur de la classe

public class Gui {
    LineGraph graph = new LineGraph() {
        // extra functionality here.
    };
}

Nommé interne de la classe

public class Gui {
    MyLineGraph graph = new MyLineGraph();

    private class MyLineGraph extends LineGraph {
        // extra functionality here.
    }
}

Je ne suis pas un fan de anonyme intérieur des classes, parce que franchement je pense juste qu'il a l'air vraiment laid. Mais dans le cas d'une sous-classe qui n'est utilisé que dans un seul endroit, est nommée intérieur de la classe overkill? Qu'est-ce que la pratique acceptée?

55voto

Daniel Lew Points 39063

Un avantage de l'anonymat de la intérieur des classes, c'est que personne ne peut l'utiliser n'importe où ailleurs, alors qu'un nommé intérieure peut être utilisé (si ce n'est par la classe qui l'a créé si privé). C'est une petite différence, mais cela signifie que vous pouvez protéger un intérieur classe d'être accidentellement utilisé ailleurs.

Aussi, à l'aide de l'anonyme intérieur de la classe donne à toute lecture de votre code, une tête du haut "cette classe est utilisé ici et nulle part ailleurs." Si vous voyez un nom interne de la classe, quelqu'un pourrait penser qu'il serait utilisé dans plusieurs endroits dans la classe.

Ils sont très similaires, de sorte que ni le point est un changeur de jeu. Je pense juste qu'il contribue pour plus de clarté, si vous utilisez les classes internes anonymes pour un compromis, et nommé les classes internes lorsqu'il est utilisé plusieurs fois dans la classe.

39voto

TofuBeer Points 32441

(Contre-point à Daniel Lew)

Un inconvénient de anonyme intérieur des classes, c'est que personne ne peut l'utiliser n'importe où ailleurs, alors qu'un nommé intérieure peut être utilisé (si ce n'est par la classe qui l'a créé si privé). C'est une petite différence, mais cela signifie que vous pouvez vous assurer que l'intérieur de la classe n'est pas accidentellement recréé ailleurs.

Aussi, à l'aide de l'anonyme intérieur de la classe donne à toute lecture de votre code, un moment plus difficile jusqu'à ce qu'ils ont à analyser cette classe qui est venu de nulle part. À l'aide d'un nommé intérieur de la classe, vous êtes en mesure d'organiser la source de plus.

J'ai vu des cas où il y a deux (ou plus) les classes internes anonymes, avec exactement le même code. Dans les Interfaces graphiques en particulier (où vous pouvez avoir plusieurs commandes d'effectuer la même action), ce peut des cultures (et je parle de la production de code, pas de code que mes élèves ont écrit).

La lisibilité question va dans les deux sens, certaines personnes trouvent les classes internes anonymes mieux, car cela permet de voir ce qui se passe dans un seul endroit, les autres de trouver une source de distraction. La partie se résume à la préférence personnelle.

Aussi une classe statique est plus efficace, si vous déclarez un anonyme intérieur de la classe dans une instance alors il n'y aura plus de frais généraux, qui, si vous n'avez pas besoin d'accéder aux variables d'instance, c'est du gaspillage (mais probablement pas la peine de s'inquiéter au sujet jusqu'à ce qu'il présente comme un problème).

Ma préférence personnelle est de l'utilisation non-anonyme classes car elles permettent plus de flexibilité lorsque le code est modifié ultérieurement.

10voto

Jon Skeet Points 692016

Pourquoi avez-vous besoin de le sous-classer? S'il s'agit simplement de remplacer une méthode virtuelle existante, je pense qu'une classe interne anonyme est acceptable. Si vous ajoutez des fonctionnalités supplémentaires, j'utiliserais une classe nommée. Je ferais cependant une classe imbriquée (avec le modificateur static ) - je les trouve plus facile à raisonner :)

9voto

Jeff Grigg Points 251

Faites la chose la plus simple qui puisse fonctionner : Utilisez la classe interne anonyme.

Si vous vous rendez compte par la suite que vous avez besoin d'une portée plus large, refacturez le code pour prendre en charge cette opération.

(Vous feriez la même chose avec les variables - en les plaçant dans la portée la plus spécifique. Il est logique de faire la même chose avec d'autres actifs source.)

4voto

Kapsh Points 1588

Les classes internes anonymes sont difficiles à déboguer dans Eclipse (c'est ce que j'utilise). Vous ne pourrez pas regarder les valeurs de variables / injecter des valeurs en cliquant simplement avec le bouton droit de la souris.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X