[JAVA] Type de classe interne: avec ou sans statique

Premièrement, il existe quatre types de classes imbriquées (classes définies dans la classe):

À propos des classes imbriquées statiques et des classes imbriquées non statiques

――Les deux ont les utilisations suivantes --Lors de l'utilisation d'un objet uniquement dans la classe englobante [^ 1] --Si vous souhaitez masquer l'implémentation de la classe imbriquée dans la classe parente

MyObject.java


public class OuterObject{
    String outer = "";

    static void method() {
        InnerStaticObject innerStaticObject = new InnerStaticObject();
        InnerObject innerObject = new InnerObject(); //Erreur de compilation
    }

    /**classe imbriquée statique**/
    private static class InnerStaticObject {
        void method() {
            System.out.println(outer); //Erreur de compilation
            System.out.println(OuterObject.this.outer); //Erreur de compilation
        }
    }

    /**Classe imbriquée non statique**/
    private class InnerObject {
        void method() {
            System.out.println(outer); //Peut être référencé
            System.out.println(OuterObject.this.outer); //Peut être référencé
        }
    }
}

classe imbriquée statique

Classe imbriquée non statique

Fondamentalement, il semble préférable de l'utiliser avec statique car un non statique apporte une dépendance supplémentaire.

Classe intérieure locale

Classes définies dans les méthodes, les constructeurs, les blocs d'initialisation, les clauses if et d'autres blocs

――Il a les utilisations suivantes --Si vous souhaitez masquer l'implémentation de la classe dans un bloc

MyObject.java


class MyObject {
    private void method() {
        //Classe intérieure locale
        class LocalInnerClass implements MyInterface {
            @Override
            public void print() {
                System.out.println("Local Inner Class");
            }
        }
        LocalInnerClass localInnerClass = new LocalInnerClass ();
        localInnerClass.print();
    }
}

interface MyInterface {
    void print();
}

Classe anonyme

Une classe sans nom de classe

――Il a les utilisations suivantes

MyObject.java


class MyObject {
    private void method() {
        //Classe anonyme
        MyInterface myInterface = new MyInterface() {
            @Override
            public void print() {
                System.out.println("Anonymous Class");
            }
        };
        myInterface.print();
    }
}

interface MyInterface {
    void print();
}

[^ 1]: Classe englobante: la classe en dehors de la classe interne

Recommended Posts

Type de classe interne: avec ou sans statique
Vitesse de traitement avec et sans statique
Concept d'instance ・ Variable de type de classe ・ Constructeur ・ Membre statique
[Rails] ActiveModel :: Sérialiseurs avec ou sans imbrication explicite
Java getClass () est incompatible avec les génériques (ou les variables de type)
Champ de type de classe Java
Trouvez la classe d'adresse et le type d'adresse à partir de l'adresse IP avec Java