Question Pourquoi n'êtes-vous pas en mesure de déclarer une classe statique en Java?


Pourquoi n'êtes-vous pas en mesure de déclarer une classe statique en Java?


427
2017-08-27 12:32


origine


Réponses:


Seules les classes imbriquées peuvent être statiques. Ce faisant, vous pouvez utiliser la classe imbriquée sans avoir une instance de la classe externe.

class OuterClass{
    public static class StaticNestedClass{
    }

    public class InnerClass{
    }

    public InnerClass getAnInnerClass(){
        return new InnerClass();
    }

    //This method doesn't work
    public static InnerClass getAnInnerClassStatically(){
        return new InnerClass();
    }
}

class OtherClass{
    //Use of a static nested class:
    private OuterClass.StaticNestedClass staticNestedClass = new OuterClass.StaticNestedClass();

    //Doesn't work
    private OuterClass.InnerClass innerClass = new OuterClass.InnerClass();

    //Use of an inner class:
    private OuterClass outerclass= new OuterClass();
    private OuterClass.InnerClass innerClass2 = outerclass.getAnInnerClass();
    private OuterClass.InnerClass innerClass3 = outerclass.new InnerClass();
}

Sources :

Sur le même sujet:


460
2017-08-27 12:36



Donc, je viens en retard à la fête, mais voici mes deux cents - philosophiquement ajoutant à la réponse de Colin Hebert.

Au plus haut niveau, votre question traite de la différence entre les objets et les types. Bien qu'il y ait beaucoup de voitures (objets), il n'y a qu'une seule classe Car (type). Déclarer quelque chose comme statique signifie que vous travaillez dans l'espace "type". Il n'y a qu'un seul. Le mot-clé class de niveau supérieur définit déjà un type dans l'espace "type". En conséquence, "public static classe Car" est redondant.


31
2018-06-27 21:18



Les classes de niveau supérieur sont statiques par défaut. Les classes internes sont non statiques par défaut. Vous pouvez modifier la valeur par défaut pour les classes internes en les marquant explicitement. Les classes de niveau supérieur, en raison de leur niveau supérieur, ne peuvent pas avoir de sémantique non statique car il ne peut y avoir de classe parent à laquelle se référer. Par conséquent, il n'existe aucun moyen de modifier la valeur par défaut pour les classes de niveau supérieur.


30
2017-08-18 21:12



La classe avec le constructeur privé est statique.

Déclarez votre classe comme ceci:

public class eOAuth {

    private eOAuth(){}

    public final static int    ECodeOauthInvalidGrant = 0x1;
    public final static int    ECodeOauthUnknown       = 0x10;
    public static GetSomeStuff(){}

}

et vous pouvez utiliser sans initialisation:

if (value == eOAuth.ECodeOauthInvalidGrant)
    eOAuth.GetSomeStuff();
...

29
2018-05-31 16:28



Bien sûr, ils peuvent, mais seulement interne classes imbriquées. Cela signifie que les instances de la classe imbriquée ne requièrent pas d'instance englobante de la classe externe.

Mais pour les classes de niveau supérieur, les concepteurs de langage ne pouvaient pas penser à quelque chose d'utile à faire avec le mot-clé, donc ce n'est pas autorisé.


12
2017-08-27 12:36



Vous pouvez créer une classe d'utilitaire (qui ne peut pas avoir d'instances créées) en déclarant un type enum sans aucune instance. c'est-à-dire que vous déclarez spécifiquement qu'il n'y a pas d'instances.

public enum MyUtilities {;
   public static void myMethod();
}

12
2017-08-27 22:13



public class Outer {
   public static class Inner {}
}

... il peut être déclaré statique - tant qu'il s'agit d'une classe membre.

De la JLS:

Les classes de membres peuvent être statiques, auquel cas elles n'ont pas accès aux variables d'instance de la classe environnante; ou ils peuvent être des classes internes (§8.1.3).

et ici:

Le mot-clé statique peut modifier la déclaration d'un membre de type C dans le corps d'une classe non interne T. Son effet est de déclarer que C n'est pas une classe interne. Tout comme une méthode statique de T n'a pas d'instance actuelle de T dans son corps, C n'a pas non plus d'instance actuelle de T, ni d'instances englobantes lexicales.

Un mot-clé statique n'aurait aucun sens pour une classe de niveau supérieur, simplement parce qu'une classe de niveau supérieur n'a pas de type englobant.


8
2017-08-27 12:36



Comme expliqué ci-dessus, une classe ne peut être statique que si elle appartient à une autre classe.

Si vous cherchez à concevoir une classe "dont il ne peut y avoir plusieurs instances", vous pouvez regarder dans le modèle de conception "Singleton".

Info Singleton Débutant ici.

Caveat:

Si vous envisagez d'utiliser le   motif singleton, résiste à tous   votre puissance. C'est l'un des plus faciles   DesignPatterns à comprendre, probablement   le plus populaire, et certainement le   le plus abusé.    (source: JavaRanch comme lié ci-dessus)


5
2017-08-27 12:51



En plus de la façon dont Java définit les classes internes statiques, il existe une autre définition des classes statiques selon le monde C # [1]. Une classe statique est une classe qui ne possède que des méthodes statiques (fonctions) et qui est censée prendre en charge la programmation procédurale. De telles classes ne sont pas vraiment des classes dans la mesure où l'utilisateur de la classe ne s'intéresse qu'aux fonctions d'assistance et non à la création d'instances de la classe. Bien que les classes statiques soient prises en charge en C #, ce support direct n'existe pas en Java. Vous pouvez cependant utiliser les énumérations pour imiter les classes statiques C # en Java afin qu'un utilisateur ne puisse jamais créer d'instances d'une classe donnée (même en utilisant la réflexion)  [2]:

public enum StaticClass2 {
    // Empty enum trick to avoid instance creation
    ; // this semi-colon is important

    public static boolean isEmpty(final String s) {
        return s == null || s.isEmpty();
    }
}

4
2018-05-13 21:36