web-dev-qa-db-fra.com

Étendre une énumération dans Java

J'ai une énumération, appelons-la A:

public enum A
{
    A,
    B
}

J'ai une fonction qui prend une énumération A:

public void functionA(A enumA)
{
    //do something
}

Comment puis-je créer une autre énumération, éventuellement appeler B que je peux transmettre à functionA? Quelque chose comme ça?

public enum B
{
    C
}

functionA(B.C);

Je sais que vous ne pouvez pas étendre une énumération, mais quelles sont les autres options disponibles? Quelle est la meilleure façon d'y parvenir?

23
user489041

Tu ne peux pas.

Les types d'énumération sont finaux par conception.

La raison en est que chaque type d'énumération doit avoir niquement les éléments déclarés dans l'énumération (car nous pouvons les utiliser dans une instruction switch, par exemple), et ce n'est pas possible si vous autorisez l'extension du type.

Vous pourriez faire quelque chose comme ça:

public interface MyInterface {
    // add all methods needed here
}

public enum A implements MyInterface {
    A, B;
    // implement the methods of MyInterface
}

public enum B implements MyInterface {
    C;
    // implement the methods of MyInterface
}

Notez qu'il n'est pas possible de faire un switch avec cette interface, alors. (Ou en général avoir un switch avec un objet qui pourrait provenir de plusieurs enum).

48
Paŭlo Ebermann

Vous pouvez implémenter une interface commune

interface I { }

enum A implements I {
   A, B
}
enum B implements I {
   C
}
public void functionA(I i) {
    //do something
}

obj.functionA(A.A);
obj.functionA(B.C);
17
Peter Lawrey

Vous ne pouvez pas obliger Enums à étendre d'autres Enums mais vous pouvez déclarer une interface que tous vos Enums peuvent implémenter. L'interface devra inclure toutes les méthodes que vous prévoyez d'invoquer sur vos valeurs Enum. Voici un exemple...

public class Question6511453 {
    public static void main(String[] args) {
        System.out.println(functionFoo(EnumA.FirstElem));
        System.out.println(functionFoo(EnumA.SecondElem));
        System.out.println(functionFoo(EnumB.ThirdElem));
    }

    private interface MyEnums {
        int ordinal();
    }

    private enum EnumA implements MyEnums {
        FirstElem,
        SecondElem
    }

    private enum EnumB implements MyEnums {
        ThirdElem
    }

    private static int functionFoo(MyEnums enumeration) {
        return enumeration.ordinal();
    }
}

Le seul problème avec cette solution est qu'elle vous enlève la possibilité d'utiliser l'Enum comme vous le souhaitez normalement dans les instructions switch car les ordinaux et les valeurs peuvent ne plus être uniques.

Cela devrait répondre à votre question, mais je doute que cela vous aidera réellement à résoudre votre problème. :(

5
Jesse Webb

Vous devez ajouter l'item C à votre énumération A. Si c'est quelque chose sans rapport et l'ajouter n'a pas de sens, la fonction A () ne devrait probablement pas être celle qui le gère.

4
ahans