Я работаю над клиентом, который использует стандартизованный веб-сервис, однако один из поставщиков ведет себя несколько иначе, так что мы должны учитывать эти поведения. Для этого мы используем перечисление:Использование базового 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;
}
}
}
Но, кажется, взвинченный мне иметь перечисление с в перечислении, что каждый трюм тот же диапазон значений. Есть лучший способ сделать это?
Любая причина, вы не можете просто добавить '' colour' в ServiceProviderType'? – Andreas
'colour' и другие переменные не будут распространены для каждого' ServiceProviderType' - переменные будут меняться в соответствии с тем, что мы запрашиваем у поставщика услуг. Общность - это перечисление. – Michael
Мне действительно непонятно, в чем проблема, что у вас есть. На самом деле это не вопрос об перечислениях почти так же, как о спецификации проблемной области и модели. «Плохо разработанный API может испортить класс навсегда» - Дж. Блох. Возможно, перечисление - это изящный способ пойти (перечисление стратегий - вещь), но, возможно, нет. Я недостаточно знаком с вашим проектом, чтобы знать, как помочь. – scottb