web-dev-qa-db-fra.com

utilisation de classes internes en Java - enum

J'ai un problème très spécifique lié à une classe interne. Laissez-moi vous montrer un exemple de code:

class Foo {
    MYOPTIONS temp;

    public static enum MYOPTIONS {
        OPTION1, OPTION2, OPTION3;
    } 
}

Donc, cette énumération est dans la classe Foo. Maintenant, ce que je veux faire, c'est définir la variable temp comme l'une des trois options, mais le faire en dehors de la classe Foo, par exemple à partir d'une classe appelée External. Malheureusement, je ne peux pas avoir de méthode définie pour faire cela car External.setTemp (MYOPTIONS.OPTION1) n'est pas valide, car l'énumération n'est pas visible dans la classe external. La seule chose que je puisse trouver, c'est d'avoir trois méthodes dans la classe Foo:

public void setTempOption1 () {this.temp=MYOPTIONS.OPTION1;}
public void setTempOption2 () {this.temp=MYOPTIONS.OPTION2;}
public void setTempOption3 () {this.temp=MYOPTIONS.OPTION3;}

Évidemment, l’autre option est de changer l’énumération et de ne pas l’avoir comme classe interne. Y at-il d’autres options qui me manquent? Merci.

12
sakis kaliakoudas
class ContainsInnerEnum {
    MYOPTIONS temp;

    public enum MYOPTIONS {
        OPTION1, OPTION2, OPTION3;
    } 
}

class EnumTester {
    public void test () {
        ContainsInnerEnum ie = new ContainsInnerEnum ();
        // fail:
        // ie.temp = MYOPTIONS.OPTION1;
        // works:
        ie.temp = ContainsInnerEnum.MYOPTIONS.OPTION1;
    }       
}

Le nom complet des MYOPTIONS contient le nom de la classe d’incorporation.

22
user unknown

La déclaration est valide, mais vous devez l'utiliser de cette façon:

Foo.MYOPTIONS var = Foo.MYOPTIONS.OPTION1

Il vous manque le nom de la classe lorsque vous utilisez "enum". 

2
Ignux02

Vous pouvez le faire comme ça:

Foo f = ...;
f.temp = Foo.MYOPTIONS.OPTION1;

Bien que je recommande également d'externaliser MYOPTIONS.

1
Anthales

Vous devez vous référer à Foo lorsque vous utilisez MYPOTIONS enum:

public class Uta {
    public static void main(String[] args) {
        Foo foo = new Foo();
        foo.temp = Foo.MYOPTIONS.OPTION1;
    }
}

En supposant que la classe Foo soit dans le package foo (vous devez toujours organiser classes dans les packages ), vous pouvez également utiliser static imports , pour rendre votre code un peu plus propre:

package foo;

import static foo.Foo.MYOPTIONS.OPTION1;

public class Uta {
    public static void main(String[] args) {
        Foo foo = new Foo();
        foo.temp = OPTION1;
    }
}
1
Moritz Petersen