質問

間違っている可能性がありますが、から推測しているのは、メソッドでローカルに列挙できないのはなぜですか?  Javaの列挙型はローカルで宣言できないため、メソッドがEnum型を返すのに問題があるということですか?メソッドはEnumを返す必要があることを宣言できます(以下を参照)が、そのようなメソッドを実装してnull以外、またはメソッドの外部で宣言されたEnumへの参照を返すにはどうすればよいでしょうか?私の最初の傾向は、このためにジェネリックを使用して調査することですが、SOコミュニティが私を助けることができるなら、行き止まりを避けたいです。

private Enum resources() {
    return null;
}
役に立ちましたか?

解決

あなたは正しいと思う、それは null またはどこか他の場所で宣言された Enum を返すことしかできないだろう。ただし、必ずしも「その他」を指定する必要はありません。コンパイル時に。

  class EnumEnumerator<T extends Enum<T>> implements Iterable<T> {
    private final Class<T> enumClass;

    public EnumEnumerator(Class<T> enumClass) {
      this.enumClass = enumClass;
    }

    public Iterator<T> iterator() {
      T[] values = enumClass.getEnumConstants();
      return Arrays.asList(values).iterator();
    }
  }

その後、ジェネリックコンストラクターを特化して、目的の列挙型クラスを渡すことで呼び出します:

class EnumEnumeratorDemo {
    enum Foo {
        BAR, BAZ, QUX;
        @Override public String toString() {
            return name().toLowerCase();
        }
    }

    public static void main(String[] args) {
        for (Foo f : new EnumEnumerator<Foo>(Foo.class)) {
            System.out.println(f);
        }
    }
}

(これは明らかに不自然な例であり、実際にはFoo.values()を呼び出す必要がありますが、アイデアは得られます。)

他のヒント

JavaがEnumを行う方法の全体のポイントは、それらがタイプセーフであるということです。したがって、(& )クラスのように機能します。スーツには4つの「列挙」があります。インスタンス。

&quot; Suit&quot;を期待している場合、&quot; Rank&quot;を返すとよいでしょう。 7の?それはすべてを壊すでしょう!

&quot; Enum&quot;を渡した場合もまたは一般的な値の場合、そのメソッドを呼び出すことはできません。 TypeSafe列挙型の最もクールな点は、「Suit」を取得できることです。 &quot; Suit.getColor()&quot;を呼び出しますそして、そのスーツの色を取得することを完全に期待しています。また、次の条件を満たすranksHigherThan(Suit s)を使用することもできます。

assertTrue(SPADES.ranksHigherThan(HEARTS));

または、さらに重要なこと:

suit1.ranksHigherThan(suit2);

(それらが両方とも渡されたと仮定し、それらが何であるかわからない)

タイプセーフティは本当に素晴らしい(最初は少し不快に感じますが)、それを受け入れます。

すべての列挙型はEnumインターフェースを実装しているため、この方法で列挙型を返すメソッドを確実に作成できます。ただし、このメソッドは単一の列挙値を返します。列挙全体を包含する一般的な値を返す方法はありません(クラスを返し、リフレクションを行うことは別として)。ただし、私が思うに多かれ少なかれすべての列挙値を返すことができます。

enum Resources { ONE, TWO, THREE }
private Enum<?>[] resources() {
    return Resources.values();
}

このアプローチの利点の1つは、たとえば次のような値を返すことができることです。

enum Resources { ONE, TWO, THREE }
enum MoreResources { UN, DEUX, TROIS }
private Enum<?>[] resources() {
    List<Enum<?>> resources = new ArrayList<Enum<?>>();
    resources.addAll(Arrays.asList(Resources.values());
    resources.addAll(Arrays.asList(MoreResources.values());
    return resources.toList(new Enum<?>[] {});
}

よりタイプセーフなさらに良いアプローチは、対象の列挙型を持つことです 共通のインターフェースを実装します。例:

public interface Resources {}
enum SomeResources implements Resources { ONE, TWO, THREE }
enum MoreResources implements Resources { UN, DEUX, TROIS }
private Resources[] resources() {
    List<Resources> resources = new ArrayList<Resources>();
    resources.addAll(Arrays.asList(Resources.values());
    resources.addAll(Arrays.asList(MoreResources.values());
    return resources.toList(new Resources[] {});
}

インターフェイスに追加のメソッドを追加して、より多くの機能を提供できます。

何を達成しようとしていますか?これは Enum を返す方法です:

public class Test
{
    public static void main(String args[])
    {
        System.out.println(doit());
    }

    public enum Foo {
        BAR,
        BAZ;
    }
    public static Enum doit() {
        return Enum.valueOf(Foo.class,"BAR");
    }
}

しかし、これはあなたが意図していることではないと思いますか?

はい、間違いなく可能です。

private Enum getRetentionPolicy() {
    return java.lang.annotation.RetentionPolicy.SOURCE;
}

Enumの宣言に関する質問の場合は、列挙することができます:

  • トップレベルの class に似た独自のjavaファイル内
  • 静的内部 class ;に似た、別のクラスに属するJavaファイル内

あなたの目標が何であるか完全にはわかりませんが、一般化されたメソッド(つまり、オーバーライドされるメソッド)を返したい場合は、次のようなものがあります:

public class MyEnumClass<T extends Enum<T>> {
    public T resources() {
        //do stuff here
    }
}

そこに何が得られるか完全にはわかりませんが、異なるEnumとその要素のセットについて話していると有益な場合があります。

Enumクラス(つまりIteratorの先駆者)について話している場合、ジェネレートされていないことがわかっているので、ジェネリックがここで大いに役立つかどうかはわかりません。

enumの値は、その名前で参照できます。 Suit.SPADES。

values()メソッドを使用してすべての値を反復処理し、いずれかの値を選択できます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top