2009-09-15 20 views
7

私は間違っているかもしれませんが、私はWhy can't enums be declared locally in a method? から推測しています。Javaの列挙型はローカルで宣言できないため、型の列挙型を返すメソッドには問題がありますか?メソッドはEnum(以下を参照)を返すはずですが、null以外の何かを返すようなメソッドの実装や、メソッドの外で宣言されたEnumへの参照をどうやって行うのですか?私の最初の傾向は、ジェネリックスを使ってこれを調べることですが、SOコミュニティが避けてくれるようなら、私はどんな猶予も避けたいと思います。Javaメソッドは型Enumを返すことができますか?

private Enum resources() { 
    return null; 
} 
+0

'Enum'型または' Enum'値を返したいのですか? – jjnguy

+0

質問のタイトルが最も適切であるかどうかわかりません。あなたは実際に何をしたいですか? –

+0

混乱して申し訳ありませんが、私は確信していると誤解する可能性があります(私の考えは午後遅くに始まります)が、私は方法が一般的な列挙型*メンバーではない*列挙から –

答えて

8

私はあなたが正しいと思いますが、nullまたはEnumを別の場所で宣言して返すことしかできません。しかし、必ずしもコンパイル時に「何か他のもの」を指定する必要はありません。これは不自然な例で明らかに

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

(と実際の生活の中で、あなただけのはず:

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(); 
    } 
    } 

その後、あなたが興味を持っている一般的なコンストラクタを専門とし、列挙型クラスに渡すことによって、それを呼び出しますFoo.values()を呼び出してください。)

+0

あなたはこのクラスの使い方を追加できますか? – msysmilu

+0

完了しました。 –

+1

p.s. 'values = enumClass.getEnumConstants()' – newacct

2

あなたは何を達成しようとしていますか?これは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"); 
    } 
} 

しかし、私はこれを推測しているあなたのために行っているものではありませんか?

+1

'Enum 'が必要です。 –

+0

実際、私はこのコードを望んでいません。奇妙なことのように思えます:) – davetron5000

1

はい、間違いなく可能です。トップレベルclassに似て、自分のjavaファイル内

  • 、;:

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

    あなたの質問に列挙型をおよそ宣言されている場合は、あなたがそれらを宣言してもよいです

  • 他のクラスに属するJavaファイル内では、静的な内部のclassに似ています。
1

全くわからない何あなたの目標ですが、あなたは総称化法(上書きされるだろう、すなわち1)を返すしたい場合は、以下のようなものかもしれません:

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

全くわからないが何あなたはEnumとその要素の異なるセットについて話しているなら有益かもしれませんが、そこで利益を得るでしょう。

私が知る限り、Enumクラス(すなわち、Iteratorへのパスカル)について話している場合、ジェネリックがここで多く役立つとは確信していません。

1

名前の列挙型の値を参照できます。 Suit.SPADES。

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

3

すべてのenumはインターフェイスEnumを実装しているので、このようにenumを返すメソッドを作成できます。しかし、このメソッドは単一のenum値を返します。 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<?>[] {}); 
} 

よりタイプセーフであっても、より良いアプローチは、関心 の列挙型は、共通のインタフェースを実装することです例えば

さらに多くの機能を提供するために、インターフェイスにメソッドを追加できます。

3

Javaが列挙する方法の全ポイントは、型保証されているということです。代わりに、あなたが定義した実際の型(「Suit」など)を返す代わりにEnumを返すことはありませんこれはクラスのように機能します。スーツには4つの「列挙」インスタンスがあります。

「スーツ」を期待していた場合は、「ランク」を7に戻すとどうなりますか?それはすべてを破るだろう!

また、 "Enum"や何らかの一般的な値を渡した場合、そのメソッドを呼び出すことができませんでした。 TypeSafe列挙型の最もクールなことは、単に「スーツ」を取得して「Suit.getColor()」を呼び出して、そのスーツの色を完全に取得できることです。それとも、もっと重要な

assertTrue(SPADES.ranksHigherThan(HEARTS)); 

を:あなたも果たすかもしれないranksHigherThan(スーツs)を持つことができ

suit1.ranksHigherThan(suit2); 

(彼らは両方ともに渡された、あなたは彼らが何であるかを知らないと仮定した場合)

タイプの安全性は本当に素晴らしいです(最初は少し不快だったにもかかわらず)、それを受け入れます。

関連する問題