web-dev-qa-db-ja.com

Java-enumで内部クラスを使用する

私は内部クラスに関係する非常に特定の問題を抱えています。サンプルコードをいくつか紹介しましょう。

_class Foo {
    MYOPTIONS temp;

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

したがって、この列挙はFooクラス内にあります。ここで私がしたいのは、temp変数を3つのオプションの1つとして設定することですが、クラスFooの外部でそれを行います。たとえば、Externalというクラスから考えてみましょう。残念ながら、External.setTemp (MYOPTIONS.OPTION1)は有効ではないため、setメソッドを使用してそれを行うことはできません。列挙型は外部クラスでは表示されないためです。したがって、私が思いつくことができる唯一のものは、クラスFooに3つのメソッドがあることです。

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

明らかに、他のオプションは列挙を変更し、それを内部クラスとして持たないことです。他に欠けているオプションはありますか?ありがとう

14
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;
    }       
}

MYOPTIONSの完全な名前には、埋め込みクラス名が含まれます。

24
user unknown

宣言は有効ですが、次のように使用する必要があります。

Foo.MYOPTIONS var = Foo.MYOPTIONS.OPTION1

「列挙型」を使用しているときに、クラスの名前がありません。

2
Ignux02

あなたはこのようにそれを行うことができます:

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

MYOPTIONSを外部化することもお勧めしますが。

1
Anthales

Foo列挙型を使用する場合は、MYPOTIONSを参照する必要があります。

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

クラスFooがパッケージfooにあると仮定すると(常に パッケージ内のクラス を編成する必要があります)、 静的インポート も使用できます。 、コードを少しきれいにするために:

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

内部的にはすべてのenum定数はenum型のオブジェクトを返します(つまり、Foo.MYOPTIONS.OPTION1はMYOPTIONS型のオブジェクトを返します)。したがって、独自のインスタンス化(つまりnew Foo.MYOPTIONS();を作成できません)numの明示的なenumオブジェクトを作成できませんそれ自体がオブジェクトを提供します)

したがって、デフォルトで参照変数を出力する場合は、.toString();メソッドが呼び出されます。列挙型toString(); mehodはオーバーライドされ、定数の名前を返します。したがって、Objectとenumの両方を1行で定数にすることができます(例:Foo.MYOPTIONS.OPTION1)例:

    class Foo {
        MYOPTIONS temp;

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

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

enumオブジェクトを明示的にインスタンス化するためにこの行を書く場合、それだけです

(foo.temp = new Foo.MYOPTIONS();)

enter code here

次のようなコンパイル時エラーが発生する可能性があります:-

エラー:列挙型はインスタンス化されない可能性があります

0
Hemanth Newton