25

この列挙型が独自のファイルで宣言されているのはなぜですか。これには利点がありますか?また、これを2つのファイルのいずれかに入れるにはどうすればよいでしょうか。私は本当に自分が何をしているのか分かりません。これは教科書の例であり、私は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;
    }
}
4

3 に答える 3

33

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(ネストされた列挙型は暗黙的に静的であるため、キーワードは必要ありません。JLS8.9を参照してください。)


この列挙型が独自のファイルで宣言されているのはなぜですか。

コード作成者がこの方法でそれを行うことを選択したため1

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

はい。これは、それを使用するためにを修飾する必要がないことを意味しますenum...enum上記のようにネストされている場合に修飾する必要がある状況では。


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


1-コード作成者がそれを選択した本当の理由を知りたい場合は、彼らに尋ねる必要があります!

于 2013-01-21T02:05:24.853 に答える
18

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

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

以下も考慮してください。

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

また、両方を組み合わせることもできます。それらは非常に強力なツールです。

于 2013-01-21T01:54:35.607 に答える
5

Anenumはaclassであり、同じ規則に従います。

それを独自のファイルに置くことは、内部クラスを別のファイルに移動することとまったく同じであり、それ以上でもそれ以下でもありません。OuterClass.ScaleNameつまり、クラスの1つに移動して、構文を使用して外部からアクセスできるようにすることができます。

于 2013-01-21T01:53:12.327 に答える