私は標準化されたWebサービスを使用するクライアントで作業していますが、ベンダーの1人はこれらの動作を考慮する必要があります。これを行うには、私たちがenum使用されています:従属enumのデフォルトとしてベースenumを使用
public enum ServiceProviderType {
FOO, BAR;
public ServiceProviderType checkService(String url) {
if (url.equals("http://www.example.com")) {
return ServiceProviderType.FOO;
} else {
return ServiceProviderType.BAR;
}
}
}
は、これらの行動の差はまた、我々はサービスから依頼内容に応じて異なるが、例えば、我々は層を要求する可能性があり、その層が赤色にしたいが、それBARを知っていますFOOサービスはRGB値を別々に表します。これを行うために、サービスの各レイヤーに必要なプロパティを格納する別の列挙型を作成しました。
public enum LayerServiceProviderType {
FOO("#ff0000"),
BAR("#ff5555");
private String colour;
public ServiceProviderType(String colour) {
this.colour = colour;
}
public String getColour() {
return colour;
}
public ServiceProviderType checkService(String url) {
if (url.equals("http://www.example.com")) {
return ServiceProviderType.FOO
} else {
return ServiceProviderType.BAR;
}
}
}
これは、我々は、複数の層を処理し、同じベースの列挙型のすべてのもの誘導体としてそれらを扱いたいときを除いて正常に動作します。基本的には、Layer1ServiceProviderType.BARをLayer2ServiceProviderType.BARと同等のものとして扱いたいと考えています。しかし、列挙型をサブクラス化することはできません。そのようにしようとしても、あらゆる種類の健全な設計原則を破るようです。
私が最初に考えたのは列挙型が含まれているインタフェース持つことでした。
interface ServiceProvider {
ServiceProviderType {FOO, BAR};
ServiceProviderType getServiceProviderType();
ServiceProvider checkService(String url);
}
public enum LayerServiceProvider implements ServiceProvider {
FOO (ServiceProviderType.FOO, "#ff0000"),
BAR (ServiceProviderType.BAR, "#ff0000");
public LayerServiceProvider(ServiceProviderType serviceProviderType, String colour) {
this.serviceProviderType = serviceProviderType;
this.colour = colour;
}
@Override
public ServiceProviderType getServiceProviderType() {
return this.serviceProviderType;
}
@Override
public ServiceProvider checkService(String url) {
if (url.equals("http://www.example.com")) {
return LayerServiceProviderType.FOO
} else {
return LayerServiceProviderType.BAR;
}
}
}
をしかし、それぞれが同じ値の範囲を保持する列挙中で列挙型を持っている私には神経が高ぶったようです。これを行うより良い方法はありますか?
任意の理由は? – Andreas
'colour'と他の変数はすべての' ServiceProviderType'に共通ではありません - 変数はサービスプロバイダから要求されたものに従って変更されます。共通性は列挙です。 – Michael
あなたが持っている問題が本当に私には分かりません。これは、問題ドメインの仕様とモデル設計とほぼ同じくらいenumについての質問ではありません。 「うまく設計されていないAPIは、クラスを永遠に破壊する可能性があります」 - J. Blochおそらく列挙型はエレガントな方法です(戦略の列挙型は問題ですが、そうではないかもしれません)。私はあなたのプロジェクトで、どのように手助けをするかを知っているだけでは十分ではない。 – scottb