0

最近、次の構造のコードを発見しました。

インターフェース:

public interface Base<T> {

    public T fromValue(String v);

}

列挙型の実装:

public enum AddressType implements Base<AddressType> {

    NotSpecified("Not Specified."),

    Physical("Physical"),

    Postal("Postal");

    private final String label; 

    private AddressType(String label) { 
        this.label = label; 
    } 

    public String getLabel() { 
        return this.label; 
    }

    @Override
    public AddressType fromValue(String v) {
        return valueOf(v);
    }
}

私の即時の反応は、逆シリアル化またはリフレクションによって列挙型のインスタンスを作成できないため、fromValue()静的にする必要があるということです。

私は議論を始めようとしているわけではありませんが、これは正しいですか? なぜEnumがインターフェイスを実装するのかを読みました。提供された回答に完全に同意しますが、上記の例は無効です。

「アーキテクト」が私の答えを受け入れたくないので、私がこれを行っているのは、上記のアプローチが良い/悪い理由を (事実とともに) 強力な議論を作成するためです。

4

3 に答える 3

1

私の意見では、この設計は間違っています。使用するにvalueFrom()は、この列挙型のインスタンスを事前に取得する必要があります。したがって、次のようになります。

AddressType type = AddressType.Postal.valueFrom("Physical");

それはどういう意味ですか?

于 2012-08-01T10:14:38.503 に答える
1

インターフェイスBaseは宣言されておらずvalueOffromValueメソッドは実際に実装されています。このコードがコンパイルされない理由がわかりません。valueOf内の呼び出しを参照している場合fromValue、それはすべての列挙型に対して定義された静的メソッドの呼び出しです。fromValueただし、実際のメンバーを呼び出して取得するためだけに列挙型の任意のメンバーが必要なため、その設計はかなり見当違いであることに同意する必要があります。

一方、私が現在行っているプロジェクトでは、共通のインターフェイスを実装するいくつかの列挙型があります。これは、列挙型が関連しており、共通のセマンティクスに関してそれらを均一に処理できるようにしたいためです。

于 2012-08-01T09:47:15.003 に答える
0

Baseインターフェースは、他の目的(もしあれば)を提供しているようです。

文字列からTを生成するため、おそらく文字列からTへのコンバーターであることが意図されています。このenumインターフェースを実装している場合、これは単に間違っています(@ yegor256はすでに理由を指摘しています)。したがって、列挙型を保持し、そのメソッドAddressTypeConverter implements Base<AddressType>で呼び出すものをいくつか持つことができます。AddressType.valueOf()fromString()

しかし、誤解しないでください。インターフェイスを実装する列挙型は悪い習慣ではありません。完全に間違っているのは、この特定の使用法だけです。

于 2012-08-01T10:22:22.497 に答える