2013-01-21 10 views
13

なぜこの列挙は、それ自身のファイルで宣言されていますか?これに利点はありますか?また、私はこれを2つのファイルのいずれかに入れることができます。私は本当に何をしているのか分かりません。これは教科書の例であるため、これを簡単な方法で説明してください.Javaはかなり新しいです。Javaで別のファイルで宣言されているのはなぜですか?

ScaleName.java

enum ScaleName {celsius, fahrenheit, kelvin, rankine}; 

Temperature.java

class Temperature { 

    private double number; 
    private ScaleName scale; 

    public Temperature() { 
     number = 0.0; 
     scale = ScaleName.fahrenheit; 
    } 

    public Temperature(double number) { 
     this.number = number; 
     scale = ScaleName.fahrenheit; 
    } 

    public Temperature(ScaleName scale) { 
     number = 0.0; 
     this.scale = scale; 
    } 

    public Temperature(double number, ScaleName scale) { 
     this.number = number; 
     this.scale = scale; 
    } 

    public void setNumber(double number) { 
     this.number = number; 
    } 

    public double getNumber() { 
     return number; 
    } 

    public void setScale(ScaleName scale) { 
     this.scale = scale; 
    } 

    public ScaleName getScale() { 
     return scale; 
    } 
} 

UseTemperature.java

class Temperature { 

    private double number; 
    private ScaleName scale; 

    public Temperature() { 
     number = 0.0; 
     scale = ScaleName.fahrenheit; 
    } 

    public Temperature(double number) { 
     this.number = number; 
     scale = ScaleName.fahrenheit; 
    } 

    public Temperature(ScaleName scale) { 
     number = 0.0; 
     this.scale = scale; 
    } 

    public Temperature(double number, ScaleName scale) { 
     this.number = number; 
     this.scale = scale; 
    } 

    public void setNumber(double number) { 
     this.number = number; 
    } 

    public double getNumber() { 
     return number; 
    } 

    public void setScale(ScaleName scale) { 
     this.scale = scale; 
    } 

    public ScaleName getScale() { 
     return scale; 
    } 
} 
+0

[* Enums *](http://docs.oracle.com/javase/1.5.0/docs/guide/language/enums.html)も参照してください。 – trashgod

答えて

20

Javaで別のファイルで宣言されているのはなぜですか?あなたはする必要はありません

は別のファイルにenumを宣言します。あなたがこれを行うことができます:

public class Temperature { 
    public enum ScaleName {celsius, fahrenheit, kelvin, rankine}; 

    private double number; 
    private ScaleName scale; 

    public Temperature() { 
     number = 0.0; 
     scale = ScaleName.fahrenheit; 
    } 
    ... 
} 

これとの唯一の違い列挙トップレベルのクラス作ることは、あなたが今あなたが別のクラスでそれを使用する列挙型の名前を修飾する必要があることです。

しかし、ここで起こっていることは、列挙型が通常のクラスであった場合に起こることと同じです。この列挙型は、独自のファイルで宣言されたのはなぜ


(そして...列挙型は、暗黙的に静的であるので、我々はstaticキーワードは必要ありません)。

コード作成者がこのようにすることを選択したためです。

これには利点がありますか?

はい。つまり、enumが上記のようにネストされている必要がある状況では、enumを使用する資格を取得する必要はありません。


実は、Javaはあなたがクラスのすべてが、1つは、「プライベートパッケージ」であることを提供する同じソースファイルに複数のトップレベルのクラスを置くことができません。しかし、これを行うことは一般的に悪いスタイルであると考えられ、いくつかのツールチェーンでは問題になる可能性があります。

+0

列挙型を独自のファイルに配置する場合は、上記のようにクラスにラップする必要はありません。 ScaleName.javaファイルの中に列挙型を "public enum ScaleName"として宣言するだけで、その名前を修飾する必要はありません。 –

+0

私はすでにそれを言っていませんでしたか? (* "唯一の違いは....") –

3

enumclassと同じ規則に従います。

それを独自のファイルにすることは、内部クラスを別のファイルに移動することとまったく同じです。だから、あなたはクラスの1つの中にそれを移動させ、OuterClass.ScaleName構文で外部からアクセスできるようにすることができます。

10

列挙型はJavaの単なる値ではなく、それ以上のものです。彼らはそれ自身のクラスです(彼らはObjectを継承します)。そして、これらのことを考慮してください。

public enum Operation 
{ 
    PLUS 
     { 
      @Override 
      public int calculate(final int i1, final int i2) 
      { 
       return i1 + i2; 
      } 
     }; 

    public abstract int calculate(int i1, int i2); 
} 

final int ret = Operation.PLUS.calculate(2, 3); 

そして、あなたはあまりにも、それらの両方を組み合わせることができます。

public enum Int { 
    ONE(1), 
    TWO(2); 

    private final int value; 

    Int(final int value) { this.value = value; } 

    public int getValue() { return value; } 

    @Override 
    public String toString() { return "I am integer " + value; } 
} 

も考えてみましょう。彼らは非常に強力なツールです。

+0

これは素晴らしい答えであると確信しています。しかし、あなたのコードは私が今まで知っている構文よりはるかに複雑です。私は専門家ではなく、学習しています。 –

+0

簡単な列挙型を使うこともできます: 'public enum Const {VALUE1、VALUE2}'。しかし、それはクラスです(いくつかの特殊性を持つクラスなので、そのまま使用されます)。 – fge

関連する問題