0

この質問は私を永遠に悩ませてきました。返事を聞くのが待ちきれません。私はこれをあまりにも頻繁に見ます

public interface Istuff
{
    public static final int STATE_B = 4;
    public static final int STATE_L = 5;
    public static final int STATE_U = 6;
}

そしてこれも

public class MyStuffConstants
{
    public static final String STATUS = "STATUS";
    public static final String RUNNING = "RUNNING";

}
4

5 に答える 5

11

列挙型と言います。それらの唯一の目的は、定数の固定セットを表すことです。

簡単な例:

enum Season { WINTER, SPRING, SUMMER, FALL }
于 2012-11-29T15:40:01.920 に答える
5

あなたはそのために使うべきenumです。それを使わないのは強力すぎる。

于 2012-11-29T15:40:20.250 に答える
3

そのためにインターフェースを使用しないでください。多くのインターフェース(他のインターフェースを拡張するインターフェースから来る可能性があります)があるとすぐに非常に厄介になります:次に、どのインターフェースで定数を選択するかを正確にする必要があり、インターフェースで定数を定義する利点が無効になります。

クリーンな解決策は、そのための非インスタンス化可能なクラスを持つことです。もちろん、列挙型が適用可能な場合(つまり、値が同じセマンティックフィールド内の異なる可能な値である場合)、列挙型を使用する必要があります。ただし、この種の定数には列挙型を使用しないでください。

public final static int DEFAULT_WIDTH = 666;
于 2012-11-29T15:45:45.037 に答える
2

コンストラクターを追加して、任意のデータを列挙型定数に関連付けることもできる場合:

public enum Season {

    WINTER(1, 15), SPRING(2, 92), SUMMER(3, 40), FALL(50, 9);

    private final int foo;
    private final int bar;

    Season(int foo, int bar) {
        this.foo = foo;
        this.bar = bar;
    }

    public int getFoo() {
        return foo;
    }

    public int getBar() {
        return bar;
    }

}
于 2012-11-29T15:55:56.193 に答える
1

IStuffの例では、排他的な順序付けビット全体が実際に必要ない場合、列挙型はやや厄介だと思います。基本的に、整数をラップするためのクラスを作成することになります。

MyStuffsの例は、定数の名前が機能する限り、列挙型を作成するのに意味があります。

誰が定数を使用するかによって決まります。クラスの内部で定数を使用することが理にかなっている場合があります(マジック値を回避します)。その場合、「private static final**;」正常に動作します。

定数をAPIの一部として使用したい場合は、必ずiStuffのように定数を実行してください(ただし、「public static final」ビットを失う可能性があります。これは、インターフェイスにそのように配置する場合のデフォルトです)。

編集:そして、そもそもインターフェースがなく、特定のものに明確に属する定数がある場合、定数はパブリックである必要がありますが、持っているだけで別のインターフェースを作成する必要はないと思います定数を置く場所。ただし、定数が2つ以上のクラス/ APIで使用され、ある場所に別の場所よりも多く属している場合は、定数を別のインターフェイスに配置してみませんか。

定数の概念は複雑すぎて、一般的な「これを行う」ステートメントでは答えられないと思います。

于 2012-11-29T15:48:58.177 に答える