17

仕様では、インターフェイスは、クラスが実行できることのコントラクトを定義することを目的としており、実装に必要な一連のメソッドが含まれていると述べています。しかし同時に、インターフェイスには定数がある場合があります。

Javaではどのような目的で許可されていますか?

インターフェイスに定数が存在するポイントは何ですか?また、それらをどのように使用できますか? 私が理解しているように、それらはメソッドによる引数としてのみ使用できます。しかし、インターフェイスはクラスがそのメソッドをどのように実装するかについて何も言っていないので、あまり意味がありません。

4

7 に答える 7

11

定数もインターフェイスの一部です。定数値は、マジック ナンバー(実装にとっては特定の意味を持つが、どこからともなく飛び出してくるように見える数字) を避けるために設計で使用されます。

数値がコードの動作に影響を与える場合が多くあります。たとえば、GUI ボタン​​のインターフェイスを考えてみましょう。このボタンが実際にどのように描画されるかは、実装次第です。しかし、インターフェイスを形成するコントラクトの一部であるボタンの種類は何ですか? 通常のプッシュ ボタンですか、それとも画像ですか、それともチェックボックスですか? この動作は定数を使用して変更できます。通常、値を OR することで使用されます。たとえば、int buttonType = PUSHBUTTON|IMAGEBUTTON.

于 2013-06-01T16:15:59.537 に答える
2

定数は、インターフェイスの外で使用できます。

たとえば、インターフェイスを実装するクラスで使用できます。これは、実装クラス全体で単一の定義が必要な場合に役立ちます。

たとえば、すべてのサブクラスで一貫して使用できるビットごとの OR スタイルの定数を定義するインターフェイスを考えてみましょう。これらの 1 つの定義のみが必要であり、1 つのセットのみを学習する必要があります。

于 2013-06-01T16:13:43.850 に答える
2

画像や音声などのリソースを使用するアプリケーションを想像してください。リソースに共通のインターフェースを定義できます。

interface MyResource {
    void load();
    void dispose();
    // ...
}

フォルダー構造は次のようになります。

+ Root
|--+ Resources
   |--+ Images
   |--+ Sounds
   |--+ Data

すべてのリソースが の下にあることがわかりますRoot/Resources/。この情報は、リソースだけでなく、他のアプリケーション コンポーネントでも共有および認識できます。

これを念頭に置くと、インターフェースは次のようになります。

interface MyResource {
    public static final String RESOURCE_ROOT_PATH = "Root/Resources/";

    void load();
    void dispose();
    // ...
}

イメージなどの特定の実装では、すべてのリソースの共通パスに基づいて、独自のルート パスを定義できます。

class MyImage implements MyResource {
    public static final String IMAGE_ROOT_PATH =
            MyResource.RESOURCE_ROOT_PATH + "Images/";

        ...
}

javax.swing.SwingConstantsまたは、実装間で特定の機能の定数を共有するために使用される のようなインターフェースを見ることができます。

enumしかし、繰り返しになりますが、この種のことについては、最近ではむしろ , を使用したいと思います。

于 2013-06-01T16:38:15.827 に答える
1

例を挙げて説明しましょう:

public interface People {
    /**
     * Gets the population for the given type
     */
    public Population getPopulationForType(int populationType);
}

上記の契約は分かりやすいと思いますか?それとも、次のほうがいいでしょうか?

public interface People {
    int BLACK_POPULATION_TYPE = 0;
    int ASIAN_POPULATION_TYPE = 1;
    int WHITE_POPULATION_TYPE = 2;

    /**
     * Gets the population for the given type
     */
    public Population getPopulationForType(int populationType);
}

FrenchPeople、AmericanPeople、および ChinesePeople の実装を持つこともできますが、これらはすべて、考えられる 3 つのタイプすべての人々の人口を返すことになっています。

于 2013-06-01T16:17:01.260 に答える
0

インターフェイス定数の考えられる用途の 1 つは、定数がすべての実装クラスで可視であることを確認することです。確かに、これらすべてをクラスに入れ、それらの実装クラスで同じクラスを使用できますが、仕様レベルで定数を定義する方がはるかに簡単です。

このように考えてください。定数は「実装」を定義していませんが、実装で必要な場合に備えて存在します。

于 2013-06-01T16:14:08.783 に答える
0

これらを使用して、メソッドの戻り引数/入力引数に記号的な意味を与えることができます。それは非常に前の列挙日でした。

于 2013-06-01T16:15:47.193 に答える