[JAVA] Point 24: Privilégier les classes de membres statiques aux non statiques

24. Sélectionnez une classe de membre statique dans une classe de membre non statique

Les classes imbriquées doivent exister dans le but d'aider la classe englobante. Si vous souhaitez utiliser des classes imbriquées dans d'autres contextes, vous devez les définir en tant que classes de niveau supérieur.

Type de classe imbriqué

Il existe quatre types de classes imbriquées

Il y a. À part les classes membres statiques, elles sont appelées classes internes.

Ce chapitre décrit quelle classe imbriquée doit être utilisée dans quelles situations et pour quelle raison.

classe de membre statique

La classe membre statique est l'un des membres statiques de la classe englobante et suit les mêmes règles d'accessibilité que les autres membres statiques.

L'une des utilisations les plus courantes des classes membres statiques est une classe d'assistance publique qui n'est valide que lorsqu'elle est utilisée face cachée avec la classe externe. À titre d'exemple, considérons enum, qui représente le fonctionnement d'un ordinateur (Item34). L'opération enum doit être une classe membre statique publique de la classe Calculator. Les utilisateurs de Calcurator peuvent se référer aux opérations comme Calculator.Operation.PLUS et Calculator.Operation.PLUS.

Classe de membre non statique

Les instances de classes membres non statiques ont implicitement des références à des instances englobantes. Dans une méthode d'instance dans une classe membre non statique, vous pouvez appeler la méthode de l'instance englobante et utiliser ce paramètre qualifié pour obtenir une référence à l'instance englobante. (Qualifié ceci fait référence à la classe englobante .this) Il est impossible de créer une instance d'une classe membre non statique sans instance englobante, c'est-à-dire que si vous voulez qu'elle soit indépendante, vous devez sélectionner une classe membre statique.

Les références aux classes membres non statiques et aux instances englobantes sont formées lorsque les classes membres sont instanciées et ne sont pas modifiées par la suite. Les références sont généralement formées en appelant les constructeurs de classes membres non statiques à partir des méthodes d'instance de la classe englobante.

Une utilisation courante pour les classes membres non statiques est Adapter. Les adaptateurs peuvent être utilisés pour faire apparaître une instance d'une classe englobante comme une instance d'une autre classe. Plus précisément, l'apparence de type collection renvoyée par les méthodes KeySet et values de Map utilise des classes membres non statiques. Comme l'itérateur sur la liste.

    public Iterator<E> iterator() {
        return new Itr();
    }

    /**
     * An optimized version of AbstractList.Itr
     */
    private class Itr implements Iterator<E> {
    ...
    }

Si une classe membre n'a pas besoin d'accéder à l'instance englobante, elle doit toujours être déclarée statique. En effet, cela prend du temps et de la mémoire pour générer une référence pendant ce temps, et sans cette référence, elle peut être soumise au garbage collection (élément 7).

les classes membres statiques privées sont représentées comme faisant partie des composants de la classe englobante. Par exemple, considérons une instance de Map, de nombreuses implémentations de Map ont un objet Entry comme paire clé-valeur dans la Map. Puisque les méthodes Entry (getKey, getValue, setValue) n'ont pas besoin d'accéder aux méthodes map, il est inutile de faire de l'entrée une classe non statique. Cela fonctionne même s'il n'est pas statique, mais c'est un gaspillage de mémoire simplement parce qu'il ajoute des références supplémentaires à la carte.

Même si vous vous demandez s'il faut exposer une classe imbriquée à l'extérieur, il est important de choisir de la rendre statique ou non statique. Lorsqu'une classe imbriquée est exposée à l'extérieur, elle ne peut pas être modifiée de non statique à statique. (Cela violera la compatibilité descendante)

Classe anonyme

On peut dire qu'une classe anonyme est déclarée et instanciée en même temps lorsqu'elle est utilisée, plutôt que d'appartenir à une autre classe. Les classes anonymes peuvent avoir des instances de classes englobantes dans des contextes non statiques. Cependant, même si une classe anonyme est écrite dans un contexte statique, elle ne peut pas avoir de membre statique à moins qu'il ne s'agisse d'une variable constante (primitive ou variable String avec final).

Restrictions de classe anonymes

Avant l'introduction de lambda, les classes anonymes étaient utilisées comme moyen de créer de petits objets de fonction et des objets de processus (?), Mais maintenant lambda est préféré. De plus, comme exemple principal d'utilisation de la classe anonyme, elle est utilisée dans l'implémentation d'une méthode de fabrique statique. (Item20)

Classe intérieure locale

Les classes internes locales sont déclarées de la même manière que les variables locales et ont la même portée. Doit être court pour la lisibilité.

Résumé

Il existe quatre classes imbriquées, chacune avec des utilisations différentes. Préparez une classe membre lorsqu'elle doit être visible en dehors de la méthode ou trop longue pour être placée à l'intérieur de la méthode. Si chaque instance de la classe membre a besoin d'accéder à une instance de la classe englobante, elle doit être non statique. À part ça, ça devrait être statique.

Concernant la classe dans la méthode, utilisez-la à un seul endroit, et s'il existe une classe existante qui régule le comportement, utilisez la classe anonyme. Sinon, utilisez des classes internes locales.

Recommended Posts

Point 24: Privilégier les classes de membres statiques aux non statiques
Point 29: Favoriser les types génériques