8

私は間違っている可能性がありますが、なぜ列挙型をメソッドでローカルに宣言できないのですか? つまり、Javaの列挙型はローカルで宣言できないため、メソッドが列挙型を返すのは問題がありますか?メソッドが列挙型を返す必要があることを宣言できますが(以下を参照)、null以外のもの、またはメソッドの外部で宣言された列挙型への参照を返すように、そのようなメソッドを実装するにはどうすればよいですか?私の最初の傾向は、これにGenericsを使用して調査することですが、SOコミュニティがデッドエンドを回避するのに役立つ場合は、デッドエンドを回避したいと思います。

private Enum resources() {
    return null;
}
4

7 に答える 7

8

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() を呼び出す必要がありますが、アイデアは理解できます。)

于 2009-09-17T10:46:24.017 に答える
4

JavaがEnumを行う方法の全体的なポイントは、それらがタイプセーフであることです。つまり、Enumを返さずに(ダブルプラスが良くない)、定義した実際のタイプ(「Suit」など)を返します。クラスのように。スーツには 4 つの「列挙型」インスタンスがあります。

「スーツ」を期待していた場合、7 の「ランク」を返すことは何の役に立つでしょうか? それはすべてを壊すでしょう!

また、「Enum」または何らかの一般的な値を渡した場合、そのメソッドを呼び出すことはできませんでした。TypeSafe Enum の最も優れた点は、"Suit" を取得して "Suit.getColor()" を呼び出すだけで、そのスーツの色を取得できることを完全に期待できることです。次を満たす可能性のある ranksHigherThan(Suit s) を持つこともできます。

assertTrue(SPADES.ranksHigherThan(HEARTS));

または、もっと重要なこと:

suit1.ranksHigherThan(suit2);

(それらが両方とも渡され、それらが何であるかわからない場合)

型の安全性は本当に素晴らしいです (最初は少し不快に感じますが)、それを受け入れてください。

于 2009-09-15T21:35:43.677 に答える