Quel est l'avantage de rendre une classe intérieure statique avec Java?

j'ai une classe interne dans ma classe de Java.

enter image description here

quand j'exécute trouver des bogues , il recommande(avertit) de le rendre statique.

enter image description here

Quel est l'intérêt de cet avertissement? Quel est l'avantage de rendre une classe intérieure statique?

21
demandé sur prosseek 2013-04-22 16:42:29

5 réponses

si la classe imbriquée n'accède à aucune des variables de la classe enveloppante, elle peut être rendue statique. L'avantage, c'est que vous n'avez pas besoin d'une instance englobante de l'extérieur de la classe pour utiliser la classe imbriquée.

22
répondu Jeff Storey 2013-04-22 12:45:11

une classe intérieure, par défaut, a une référence implicite à un objet de la classe extérieure. Si vous instanciez un objet de ceci à partir du code de la classe externe, tout est fait pour vous. Si vous n'sinon, vous devez fournir l'objet vous-même.

une classe intérieure statique n'a pas cela.

cela signifie qu'il peut être instancié en dehors de la portée d'un objet de classe externe. Cela signifie également que si vous 'exporter' une instance de l'intérieur de la classe, il n'empêchera pas l'objet en cours à être collectées.

comme règle de base, si la classe intérieure n'a aucune raison d'accéder à la classe extérieure, vous devez la rendre statique par défaut.

9
répondu Joeri Hendrickx 2013-04-22 12:45:56

une classe intérieure Non statique fait implicitement référence à une classe extérieure. Si vous faites la classe comme statique, vous pourriez sauver un peu de mémoire et de code.

2
répondu kan 2013-04-22 12:56:02

une classe intérieure statique est une chose sémantiquement plus simple. C'est comme une classe de haut niveau, sauf que vous avez plus d'options pour la visibilité (par exemple, vous pouvez le rendre privé).

une raison importante pour éviter les classes intérieures non statiques est qu'elles sont plus complexes. Il y a la référence cachée à la classe externe (peut-être même plus d'une). Et un nom simple dans une méthode de la classe intérieure peut maintenant être l'une de trois choses: un local, un champ, ou un champ d'une classe extérieure.

un artefact de cette complexité est que la référence cachée à la classe extérieure peut conduire à des fuites de mémoire. Disons que la classe intérieure est un auditeur et pourrait être une classe intérieure statique. Aussi longtemps que l'auditeur est enregistré, il contient une référence à l'instance de l'extérieur de la classe, ce qui peut tenir à de grandes quantités de mémoire. Rendre l'auditeur statique peut permettre à l'instance extérieure d'être ramassée.

2
répondu TimK 2013-04-23 16:53:45

nous avons déjà de bonnes réponses, voici mes 5 cents:

les classes internes statiques et non statiques sont utilisées lorsque nous avons besoin de séparer les fonctionnalités logiques en utilisant les méthodes et les variables de la classe externe. Les deux classes intérieures ont accès aux variables privées de la classe extérieure.

avantages de la classe intérieure statique: 1) Les classes statiques peuvent accéder aux variables statiques de la classe externe 2) Les classes statiques peuvent être traitées comme un classe indépendante

classe intérieure Non statique: 1) ne peut pas utiliser les éléments statiques de la classe extérieure 2) ne peut pas être traitée comme une classe indépendante

public class NestedClassDemo {
    private int a = 100;
    int b = 200;
    private static int c = 500;

    public NestedClassDemo() {
        TestInnerStatic teststat = new TestInnerStatic();
        System.out.println("const of NestedClassDemo, a is:"+a+", b is:"+b+".."+teststat.teststat_a);
    }

    public String getTask1(){
        return new TestInnerClass().getTask1();
    }

    public String getTask2(){
        return getTask1();
    }


    class TestInnerClass{
        int test_a = 10;

        TestInnerClass() {
            System.out.println("const of testinner private member of outerlcass"+a+"..."+c);
        }
        String getTask1(){
            return "task1 from inner:"+test_a+","+a;
        }
    }

    static class TestInnerStatic{
        int teststat_a = 20;

        public TestInnerStatic() {
            System.out.println("const of testinnerstat:"+teststat_a+" member of outer:"+c);
        }

        String getTask1stat(){
            return "task1 from inner stat:"+teststat_a+","+c;
        }
    }

    public static void main(String[] args){
        TestInnerStatic teststat = new TestInnerStatic();
        System.out.println(teststat.teststat_a);
        NestedClassDemo nestdemo = new NestedClassDemo();
        System.out.println(nestdemo.getTask1()+"...."+nestdemo.getTask2());
    }
}

accès de l'extérieur à la classe intérieure statique et à la classe intérieure non statique:

public class TestClass {
    public static void main(String[] args){
        NestedClassDemo.TestInnerClass a = new NestedClassDemo().new TestInnerClass();
        NestedClassDemo.TestInnerStatic b = new NestedClassDemo.TestInnerStatic();
    }
}

le doc java officiel pour la classe intérieure statique peut être trouvé à https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html

0
répondu Ramesh 2017-12-07 00:36:37