2009-02-25 4 views
3

J'ai 2 fichiers qui interagissent entre eux. Je voulais définir une énumération pour rendre le code plus lisible, mais si je le définis dans le fichier 1, le fichier 2 se plaint de n'avoir aucune connaissance de ladite énumération. Si je définis ii dans le fichier 2, le fichier 1 fait de même. Je le définis comme public aussi.Question à propos de Java enums

La solution était de définir l'énumération dans les deux fichiers, mais cela ne me semble pas correct. Non seulement c'est redondant, mais je crains que cela ne provoque des conflits, même si les types ont les mêmes éléments.

Quel est le veredict à ce sujet? Est-ce que je fais quelque chose de mal ou de trop m'inquiéter?

EDIT

Eh bien, compte tenu des commentaires ici j'ai trouvé une alternative qui semble faire ce que je veux sans avoir à créer un nouveau fichier. J'avais:

fichier 1

class myClass1 
{ 
    public enum MyEnum 
    { 
     ... 
    } 
    ... 
} 

fichier 2

class myClass2 
{ 
    public enum MyEnum 
    { 
     ... 
    } 
    .... 
} 

Maintenant, j'ai:

fichier
enum myEnum 
{ 
    ... 
} 

... 

class myClass1 
{ 
    ... 
} 

fichier 2

class myClass2 
{ 
    ... 
} 

Je ne voulais pas créer un autre fichier juste pour l'énumération, donc cela fonctionne pour moi. Eh bien, tant qu'il n'y a rien de mal à cela, ce que je pense qu'il n'y a pas.

+0

Exemple de code s'il vous plaît? –

+0

Ce code fonctionnera tant que l'énumération n'aura pas à être publique. –

+0

Il est seulement partagé entre les deux classes, donc je pense que ce ne doit pas être. –

Répondre

11

Vous ne devriez définitivement pas définir l'énumération dans les deux emplacements. Je recommande de définir l'énumération dans son propre fichier avec l'accessibilité publique. Alors tout le monde devrait avoir aucun problème pour y accéder. Toutefois, en supposant que vous voulez définir l'énumération dans l'une des deux classes, je vais continuer ...

Vous devez import enum ou utiliser son nom complet. En supposant que vous êtes dans le package com.stackoverflow, vos classes devrait ressembler à cela, dans le premier fichier:

package com.stackoverflow; 

public class A { 
    public enum MyEnum { 
     ONE,TWO,THREE; 
    } 

    ... 
} 

et dans un autre fichier:

package com.stackoverflow; 

import com.stackoverflow.A.MyEnum; 

public class B { 

    public void test(MyEnum mine) { 
    ... 
    } 

    ... 
} 
+0

Vous pouvez également écrire "import com.stackoverflow.A;" et "test (Mine A.MyEnum)" –

+0

Bien que dans cet exemple A et B soient dans le même paquet, les importations ne sont pas nécessaires. Il suffit d'écrire "A.MyEnum". –

+0

MyEnum ne devrait-il pas être déclaré statique? –

3

Non - il est faux. Le enum peut être déclarée comme une classe interne statique et référencée en utilisant le nom complet

public class MyClass { 
    public static enum MyEnum { BOOK, DVD } 


    public void myMethod() { 
     MyEnum e = MyEnum.DVD; 
    } 
} 


public class B { 
    public void someMethod() { 
     MyClass.MyEnum enumVal = MyClass.MyEnum.BOOK; 
    } 
} 
+0

Les énumérations sont implicitement statiques lorsqu'elles sont déclarées en tant que classes membres, de la même manière que les interfaces sont implicitement statiques, vous n'avez donc pas besoin d'utiliser le mot clé 'static'. Juste l'avoir public. –

+0

Oui - J'ai ajouté le mot-clé statique dans l'une de mes modifications; pensé qu'il pourrait être un peu plus clair pour l'avoir explicite –

0

Vous définissez vos énumérations de la même façon que vous définissez les classes - soit dans leur propre fichier, ou que les classes internes statiques (ils » d doivent être statiques pour ne pas être liés à leur classe englobante).

La définition de votre énumération dans 2 fichiers est cassée, car c'est en quelque sorte contraire à l'objectif - vous aurez 2 enums séparés, et alors que vous voudrez tester l'égalité sur Enum.A vous aurez réellement Enum1.A ! = Enum2.A. Très perturbant. Il n'y a pas de véritable mystère pour eux, c'est juste une manière de définir des constantes plus sûres et plus efficaces que la finale publique statique.

1

Rappelez-vous aussi quand vous mettez enum dans le fichier d'une autre classe vous risquez le problème de ne pas accéder à l'énumération d'un autre paquet en raison de privilèges d'accès par défaut. ... donc il est toujours sage de mettre l'enum dans un fichier séparé avec un accès public ou comme un membre statique public d'une classe qui peut être consulté avec le nom de classe .

Questions connexes