web-dev-qa-db-ja.com

インターフェイス内の列挙型実装-Java

インターフェイスにJava enumを配置することについて質問があります。より明確にするために、次のコードを参照してください。

public interface Thing{
   public enum Number{
       one(1), two(2), three(3);
       private int value;
       private Number(int value) {
            this.value = value;
       }
       public int getValue(){
        return value;
       }
   }

   public Number getNumber();
   public void method2();
   ...
}

インターフェイスは空のボディのメソッドで構成されていることを知っています。ただし、ここで使用した列挙型には、関連付けられた値を取得するためのコンストラクターとメソッドが必要です。この例では、提案されたインターフェイスは、空のボディを持つメソッドだけで構成されません。この実装は許可されていますか?

列挙型クラスをインターフェイス内に置くべきか、このインターフェイスを実装するクラスにするべきかはわかりません。

このインターフェイスを実装するクラスに列挙型を配置した場合、メソッドpublic Number getNumber()は列挙型を返す必要があります。これにより、インターフェイスに列挙型を強制的にインポートできます。

30
Joey

enum内でinterfaceを宣言することは完全に合法です。あなたの状況では、インターフェースは列挙型の名前空間としてのみ使用されます。インターフェースは、通常どこで使用しても使用されます。

27
Jack

上記の例は以下のとおりです。

public interface Currency {

  enum CurrencyType {
    RUPEE,
    DOLLAR,
    POUND
  }

  public void setCurrencyType(Currency.CurrencyType currencyVal);

}


public class Test {

  Currency.CurrencyType currencyTypeVal = null;

  private void doStuff() {
    setCurrencyType(Currency.CurrencyType.RUPEE);
    System.out.println("displaying: " + getCurrencyType().toString());
  }

  public Currency.CurrencyType getCurrencyType() {
    return currencyTypeVal;
  }

  public void setCurrencyType(Currency.CurrencyType currencyTypeValue) {
    currencyTypeVal = currencyTypeValue;
  }

  public static void main(String[] args) {
    Test test = new Test();
    test.doStuff();
  }

}
6
MaheshB

要するに、はい、これは大丈夫です。

インターフェイスにはメソッド本体が含まれていません。代わりに、「空のボディ」と呼ばれるもの、より一般的にはmethod signaturesと呼ばれるものが含まれています。

enumがインターフェイス内にあるかどうかは関係ありません。

0
wchargin

はい、合法です。 「実際の」状況では、NumberはThingを実装し、Thingはおそらく1つ以上の空のメソッドを持ちます。

0
user949300