Quand utiliser les classes internes en Java pour les classes d'aide

Si j'ai par exemple une classe avec une classe d'assistance à certaines de ses fonctionnalités, est-il judicieux de le faire comme un intérieur de classe.

    public class Foo {
       private FooHelper helper;

       // constructor & any other logic

       public void doSomeThing() {
         helper.do();
       }
    }

    public class FooHelper {
        public void do() {
         // code
        }
    }

Dans le cas ci-dessus est-il judicieux de faire l' FooHelper comme une classe interne ? Excuses si cela semble stupide mais je suis un peu confus au sujet des cas d'utilisation.

39
demandé sur Raedwald 2013-08-23 10:16:09

11 réponses

Oui, il est tout à fait logique d'en faire une classe interne. Si aucune autre classe n'en a besoin, rendez-le privé. Si elle ne nécessite pas un accès exclusif aux membres de la classe externe, en faire une classe statique imbriquée parce qu'elle aura besoin de moins d'espace mémoire.

consultez la recommandation de le tutoriel officiel -

utilisez une classe imbriquée non statique (ou classe intérieure) si vous avez besoin d'accès vers les champs non publics d'une instance enclosante et les méthodes. Utilisation statique classe imbriquée si vous n'avez pas besoin de cet accès.

46
répondu MD Sayem Ahmed 2013-08-23 06:27:41

Si vous pensez que FooHelperpas du tout être utile pour les autres classes que Foo, alors il est logique de faire comme private intérieur de la classeFoo. Un exemple de ce type de conception peut être trouvé dans HashMap où il définit une classe intérieure privée KeySet

autrement avoir comme un

13
répondu sanbhat 2013-08-23 06:21:01

From JAVA SE Docs

Pourquoi Utiliser Des Classes Imbriquées?

c'est une façon de regrouper logiquement des classes qui ne sont utilisées qu'à un seul endroit: si une classe n'est utile que pour une autre classe, alors il est logique de l'intégrer dans cette classe et de garder les deux ensembles. L'imbrication de telles" classes d'assistants " rend leur paquet plus simple.

Il augmente l'encapsulation: considérer deux classes supérieures, A et B, où B doit avoir accès à des membres de A qui, autrement, seraient déclarés privés. En cachant la Classe B dans la classe A, Les membres de A peuvent être déclarés privés et B peut y accéder. En outre, B lui-même peut être caché du monde extérieur.

Donc Oui, il est logique d'utiliser FooHelper comme classe intérieure.

10
répondu ChandraBhan Singh 2016-12-17 18:08:52

voici quelques utilisations des classes intérieures.

  • les classes internes sont utilisées pour obtenir des fonctionnalités qui peuvent obtenir un objet mieux que la méthode.
  • ils peuvent être utilisés dans le cas où un ensemble d'opérations multiples sont nécessaires et les chances de réutilisabilité sont bonnes à l'intérieur de la classe et ils ne seront pas accessibles mais des méthodes en dehors de la classe externe.
  • les classes intérieures sont faites pour obtenir l'héritage multiple aussi.
  • les classes intérieures sont utilisées lorsqu'elles sont utiles en classe.
  • ils sont utilisés pour séparer la logique à l'intérieur des classes.

donc, si vous avez des exigences correspondant aux points ci-dessus, les classes intérieures peuvent être utilisées. Il est toujours préférable de faire la classe intérieure private pour empêcher l'accès à partir d'autres classes. Dans votre cas, l'utilisation de classes intérieures est utile pour rendre le code lisible et la logique séparée dans la classe extérieure.

6
répondu Ashwani 2018-03-13 00:21:48

les classes intérieures ont du sens quand elles sont petites et n'ont pas besoin de noms. Les auditeurs dans GUIs sont des exemples classiques où ils ont du sens.

si la classe est grande et importante, elle doit être nommée et placée dans un fichier séparé.

les classes d'écoute dans les exemples GUI normaux font une chose minuscule, généralement juste l'expédition à une autre fonction pour faire le vrai travail.

j'utilise aussi souvent des classes statiques imbriquées (qui ne sont pas techniquement des classes internes) pour les classes qui ne sont utilisées que dans le cadre d'une autre classe - Carte.L'entrée est un bon exemple de cela. Il n'est utilisé en conjonction avec une Carte, afin d'avoir la définition de l'Entrée, une partie de la Carte d'interface rend l'organisation.

Je n'ai généralement pas beaucoup d'utilisation pour d'autres types de classes imbriquées, comme les classes de membres non statiques et les classes locales. Mais ils sont parfois utiles. Pour un bon exemple d'une utilisation légitime pour les classes de membres, voir le code source pour LinkedList.ListItr. Il s'agit d'une classe intérieure privée dont le but est de fournir une implémentation de ListIterator LinkedList. Pour ce faire, il est utile d'avoir accès aux données privées à l'intérieur de la LinkedList. Pour atteindre cet objectif en utilisant seulement des classes de premier niveau, il aurait été nécessaire d'exposer plus de méthodes publiques dans LinkedList pour permettre au ListIterator d'obtenir la mise en œuvre sous-jacente de la LinkedList. Au lieu de cela, l'utilisation d'une classe interne permet LinkedList pour garder sa mise en œuvre privée, comme il se doit.

1
répondu code_fish 2013-08-23 06:23:13

Oui, l'avantage d'utiliser la classe intérieure est qu'elle peut accéder aux membres de la classe extérieure.Dans votre cas, si vous pensez que votre FooHelper n'est pas utilisé par une autre classe,vous pouvez faire un intérieur de classe.

pour vérifier l'utilité de la classe interne, passez en revue les exemples de L'AWT. Les classes internes anonymes sont largement utilisées dans les gestionnaires d'événements.

1
répondu Malwaregeek 2013-08-23 06:23:41

qu'est-Ce que Foochamp d'application? Lorsque Foodomaine de la classe du modèle avec son propre cycle de vie et helper service commun, semble comme le mélange de deux objets très différents portée/cycle de vie.

typiquement, l'entité du domaine a son propre cycle de vie, de la création à la persistance, en passant par le GC. D'un autre côté, l'assistant ou le service est soit statique ou mieux dynamique avec lifecycle égale à l'ensemble de l'application, par exemple Spring bean.

une fois votre domaine entité contiendrait la référence d'un service il peut vous apporter de graves problèmes. Par exemple: chaque appel au dépôt est Get doit injecter la référence de ce service dans l'entité du domaine. Je vous recommande d'éviter ce modèle.

il n'est pas évident pour moi qui va faire instance de Helper pour vous.

0
répondu Martin Podval 2013-08-23 06:26:08

Hild, Oui, il est logique d'utiliser une classe interne dans de nombreux cas.

pensez - y de cette façon-la classe intérieure vivra et mourra avec la classe extérieure, de sorte que toute fonctionnalité qui est spécifiquement nécessaire pour la classe extérieure peut être ajoutée à la classe intérieure. Les exemples les plus populaires sont - les écouteurs dans la plupart des cas - les types de KeyListeners, MouseListeners, eventListeners.

les Classes en Java vous permettent d'avoir des fonctionnalités spécifiques, mais parfois vous pouvez avoir besoin d'avoir une fonctionnalité spécialisée, mais elle doit aussi être intimement liée à la classe que vous concevez.

Il peut y avoir quatre types de classes internes. Une simple recherche sur google peut vous aider à en savoir plus sur eux.

0
répondu Ravindra Mijar 2013-08-23 06:29:57

classes imbriquées, vous permettent de grouper logiquement des classes qui ne sont utilisées qu'à un seul endroit, d'augmenter l'utilisation de l'encapsulation, et de créer du code plus lisible et maintenable. Cours locaux, cours anonymes.

http://docs.oracle.com/javase/tutorial/java/javaOO/whentouse.html

0
répondu Rahul Maurya 2015-03-10 19:40:38

il y a deux autres types de classes intérieures. Vous pouvez déclarer une classe intérieure dans le corps d'une méthode. Ces classes sont appelées classes locales. Vous pouvez également déclarer un intérieur de classe dans le corps d'une méthode, sans nommer la classe. Ces classes sont connues sous le nom de classes anonymes.

classe Locale: Utiliser si vous avez besoin de créer plus d'une instance d'une classe, d'accéder à son constructeur, ou à introduire un nouveau type nommé (parce que, par exemple, vous avez besoin d'invoquer supplémentaires méthodes tard).

classe Anonyme: Utiliser si vous avez besoin de déclarer des champs ou d'autres méthodes.

0
répondu Khaula Fathima 2015-06-08 16:34:21

Quand utiliser les classes internes?

  1. la classe intérieure n'a pas besoin de fichier supplémentaire ou séparé pour placer.
  2. Évite beaucoup de classes d'aide et Convient pour expliquer le principe OOD de confinement.
  3. tout le code dans le même fichier augmente la lisibilité et augmente les performances (comme le code en ligne). Leur importance est croissance dans le codage et traitée comme une bonne pratique.
  4. les classes internes anonymes sont très utiles lorsque vous voulez définir des callbacks à la volée.
  5. un objet d'une classe interne peut accéder à l'implémentation de l'objet qui l'a créé - y compris les données privées.
0
répondu Premraj 2016-09-28 01:36:18