Попытка удалить избыточные случаи переключения

#java #switch-statement #backend

#java #switch-инструкция #серверная часть

Вопрос:

На данный момент я работаю над проектом, и у меня есть несколько переключений с красным флагом в моем коде, которые я хотел бы уменьшить. Мое объяснение довольно длинное, пожалуйста, потерпите меня.

У меня есть объект-контейнер. Этот контейнер имеет значение определенного типа (bool, int, email …), и мне нужно иметь возможность переключать этот тип. Например, мне нужно переключить «строковый» контейнер на «Целочисленный» контейнер, если значение можно преобразовать. Сначала я думал использовать Generics, но по другим причинам я не могу переделать объект container. Мне нужно иметь возможность изменять его, не создавая новый контейнер. Я создал суперкласс Supertype и для каждого возможного значения подкласс: IntType , BooleanType и т.д. Проблема с этим подходом заключается в том, что в каждом подклассе существует метод « canValueConvertToType (перечисление, соответствующее типу)», который имеет оператор switch, который проверяет наличие различных типов, которые мы можем использовать.

Переключатели — это красные флажки, я знаю, и это красный флаг в огне, поскольку каждый раз, когда вводится новый тип, мне пришлось бы добавлять его к переключателю в каждом отдельном подклассе.

Моя идея состояла в том, чтобы преобразовать текущее значение в строку и сравнить эту строку с каждым типом в централизованном классе, чтобы при наличии нового типа я добавлял только одно сравнение в этом одном месте.

Есть ли лучший способ решить эту проблему?

Редактировать:

 <<centralized class>>
public class HulpMethodes {


    public static SuperType createSuperType(Enum type, Object value){
        switch(type){
            case BOOLEAN: return new BoolType((Boolean) value);
            case INTEGER: return new IntType((Integer) value);
        }

        return null;
    }

    public static  boolean canValueConvertToType(Enum type, String value){
        switch(type){
            case BOOLEAN: return <<method to check this>>
            case INTEGER: return <<method to check this>>
        }
    }
}
  

В старой версии этот переключатель был бы доступен для каждого подкласса.

 <<Old example of canConvert-Method in IntType>>
@Override
   public boolean canValueConvertToType(Enum type) {
       switch(type){
           case BOOLEAN:
               return false;
           case EMAIL:
               return false;
           case STRING:
               return true;
           case INTEGER:
               return true;
       }
       return false;
   }
  

Способ вызова этих методов изменится на.

 public class Container {

    private SuperType type;

    public Container(Enum type, Object value){
        this.type = HulpMethodes.createSuperType(type,value);
    }

    public void canValueConvertToType(Enum type){
        HulpMethodes.canValueConvertToType(type, this.type.valueToString());
    }


}
  

против

 public class Container {



    private SuperType type;

        public Container(Enum type, Object value){
            this.type = HulpMethodes.createSuperType(type,value);
        }

        public void canValueConvertToType(Enum type){
            this.type.canValueConvertToType(type);
        }


    }
  

PS: пришлось объединить код из черновика с быстро написанной идеей, поэтому я надеюсь, что я не допустил ошибку в именовании или что-то в этом роде.

Комментарии:

1. Покажите нам какой-нибудь код. Я слишком глуп и ленив, чтобы визуализировать это.

2. Можете ли вы обновить код, который пытаетесь исправить?

3. я надеюсь, что это вам немного поможет 🙂