2015-12-28 3 views
0

У меня есть объект Item, имеющий 4 строковых поля и 3 булев поля. Я должен построить этот объект на основе 3 булевых переменных. Цель - всякий раз, когда любая из логических переменных истинна, мы должны создать объект, имеющий набор этих/этих булевых переменных. Если для любой ситуации ни одна из булевых переменных не верна, мы не создадим объект. Я использую COR, чтобы проверить, будет ли какое-либо из булевых полей задано или нет на основе какой-либо бизнес-логики. Я пытался это сделать с помощью построителя, но потом мне нужно построить так много объектов, а затем отбросить их, когда ни одна из логических переменных не будет найдена.Как создать объект на основе логического состояния?

Может ли кто-нибудь лучше подумать, решить эту проблему?

Хорошо спасибо за этот флаг для этого вопроса. Спасибо за мысли по этому вопросу. Я сделал что-то для достижения того, чего хочу. Я считаю, что это довольно гибко. Только часть, если есть зависимость от цикла If, но это приемлемо, так как класс Report может иметь дополнительное логическое значение, поэтому, когда этот класс изменен, его строитель должен быть затронут, чтобы удовлетворить это изменение. Отдых это гибкий, который я хотел. класс Доклад общественности {

метод
private String acftNo; 
    private Date plannedDate; 
    private String plannedStn; 
    private Integer mntncId; 
    private Set<String> capableStations; 
    private String routedStn; 
    private boolean isRoutedNEQPlannedStn; //Inconsistency  type 1 
    private boolean isCapableAtPlannedStn; //Inconsistency  type 2 
    private boolean isPlannedOrRoutedStationExists; //Inconsistency  type 3/5 

    public Report(String acftNo, Integer mntncId) { 
     super(); 
     this.acftNo = acftNo; 
     this.mntncId = mntncId; 
    } 

    public Report(String acftNo, Date plannedDate, String plannedStn, 
      Integer mntncId) { 
     super(); 
     this.acftNo = acftNo; 
     this.plannedDate = plannedDate; 
     this.plannedStn = plannedStn; 
     this.mntncId = mntncId; 
    } 

    //setters and getters. Removed for space. 

    public static Report buildReport(Maintenance<?> task, Set<InconsistencyReport> enumSet) { 
     Report temp = new Report(task.getAssignment().getAircraftNumber(),task.getAssignment().getMntncScheduleDate(), 
       task.getAssignment().getStationCode(),task.getAssignment().getMntncId()); 
     temp.setCapableStations(InconsistencyReport.getCapableStations(task)); 
     for(InconsistencyReport ir : enumSet) 
     { 
      if(ir.compareTo(InconsistencyReport.ROUTED_STN_NEQ_PLANNED_STN)==0) 
       temp.setRoutedNEQPlannedStn(true); 
      if(ir.compareTo(InconsistencyReport.ITEM_NT_CAPABLE_AT_PLANNED_STN)==0) 
       temp.setCapableAtPlannedStn(true); 
      if(ir.compareTo(InconsistencyReport.NO_ROUTD_STN_ON_A_DATE)==0) 
       temp.setPlannedOrRoutedStationExists(true); 
     } 
     return temp; 
    } 
} 

calculateInconsitencyReport(), который будет решать, создавать ли объект или нет.

public class InconsistencyReportChain { 

    public enum InconsistencyReport implements InconsistencyReportIface { 

     ROUTED_STN_NEQ_PLANNED_STN { 
      @Override 
      public boolean findInconsistency(Maintenance<?> task) { 
       if(!validate(task)) 
        return false; 
       //some logic 
        return true; 
       return false; 
      } 
     }, 
     ITEM_NT_CAPABLE_AT_PLANNED_STN { 
      @Override 
      public boolean findInconsistency(Maintenance<?> task) { 
       if(!validate(task)) 
        return false; 
       //some logic 
        return true; 
       return false; 
      } 
     }, 
     NO_ROUTD_STN_ON_A_DATE { 
      @Override 
      public boolean findInconsistency(Maintenance<?> task) { 
       if(!validate(task)) 
        return false; 
       //some logic 
        return true 
       return false; 
      } 
     }; 

     @Override 
     public boolean validate(Maintenance<?> task) { 
      return !(null == task.getAssignment()); 
     } 

     static Set<String> getCapableStations(Maintenance<?> task) 
     { 
      Set<String> capableStations = newHashSet(); 
      if(task.getCapStationList() != null) 
      { 
       capableStations.addAll(Arrays.asList(task.getCapStationList().split(StringConstants.COMMA_SPLIT_REGEX))); 
      } 
      if(task.getCapStationClassList() != null) 
      { 
       Map<String, List<String>> stationClassMap = CacheManager.get(STN_CLASS.name()); 
       List<String> stationClass = Arrays.asList(task.getCapStationClassList().split(StringConstants.COMMA_SPLIT_REGEX)); 
       for(String stnClass : stationClass) 
       { 
        capableStations.addAll(stationClassMap.get(stnClass)); 
       } 
      } 
      return capableStations; 
     } 
    } 

    public static Report calculateInconsitencyReport(Maintenance<?> task) { 
     Set<InconsistencyReport> enumSet = null; 
     for(InconsistencyReport iReport : InconsistencyReport.values()) 
     { 
      if(iReport.findInconsistency(task)) 
      { 
       if(null==enumSet) 
        enumSet = EnumSet.of(iReport); 
       else 
        enumSet.add(iReport); 
      } 
     } 
     if(null!= enumSet && enumSet.size() > 0) 
      return Report.buildReport(task,enumSet); 
     return null; 
    } 
} 

Helper Интерфейс:

public interface InconsistencyReportIface { 

    public boolean findInconsistency(Maintenance<?> task); 

    public boolean validate(Maintenance<?> task); 

} 

Детали класса логики прослезился от из-за безопасности.

+1

'У меня есть объект, имеющий Item 4 строковых поля и 3 булевых поля. 'Итак, булевы являются полями вашего объекта, но вы хотите создать объект, зависит от его полей?Объект уже есть, не так ли? – Kent

+0

Да, булевы являются частью объекта Item, который я хочу создать. В основном, 7 значений, которые я получаю из разных областей, но я создам этот объект Item только в том случае, если по крайней мере один из логических объектов, которые должны быть построены. Объект Item будет true. Это логическое значение также вычисляется после некоторой проверки, которую я получаю из COR (цепочки). – anirban

+0

Report.buildReport() будет вызываться, если в enumSet есть хотя бы одно значение, т. Е. Существует одна логическая переменная true. в то же время, я могу добавить больше логического типа в перечисление InconsistencyReport, и для этого мне не нужно менять логику calculateInconsitencyReport(). Добавляйте только перечисление и создайте сеттер в BuildReport и создайте логическое значение в классе Report. – anirban

ответ

1

В чем проблема? Просто создайте свой объект, когда одно из ваших логических значений истинно.

if(bool1 || bool2 || bool3) { 
    item = new Item(str1, str2, str3, str4, bool1, bool2, bool3); 
} 
+0

Проблема в том, что в будущем может потребоваться добавить boolean, тогда я должен коснуться этого объекта, построенного снова. И далее у меня нет таких bool1, bool2, bool3. Я проверяю логические значения в цикле. Итак, если я пойду по вашему дизайну, я должен проверять каждый раз, является ли какое-либо одно логическое значение истинным, если нет, то истинно ли я уже построил объект или нет в предыдущей циклической итерации. Если да, то setBool, иначе создайте объект, затем setbool. Что решит цель, но есть ли что-нибудь лучше? Почему я не могу придумать хороший образец? – anirban

0

Из того, что я понимаю из вашего описания:

а) вы будете иметь некоторый Bools, которые будут определять погоду вы создаете определенный объект или нет.

б) вы, возможно, придется включить еще несколько Bools в «проверки протокола»

с) вы должны сделать эту проверку в цикле, где

я/вы проверить для переменной BOOL

ii/вы проверяете, был ли объект ранее создан

Я все еще не совсем понял, но ... это выглядит довольно прямолинейно. Скажем, ваши bools хранятся в логическом массиве boolean[] bools и ваши строки в строковом массиве String[] strings (что, кстати, я не знаю, для чего они используются). Вы говорите, чтобы проверить, истинно ли каждый bool, а затем создать объект на основе этого результата.

boolean[] bools = new boolean[] { ... }; 
String[] strings = new String[] { ... }; 
boolean checks = false; 
for(int i = 0; i<bools.length && !checks; i++) 
    checks = bools[i]; 
//so far we will have processed if any of the bools was false, which was your condition 
if(checks) 
    Object object = new Object(); //create your desired object 

Я не понимаю, почему вы должны проверить, если объект был построен ранее, хотя, так что я не включил его в моем предложении: P

+0

Хорошо спасибо за вашу мысль. Да, ваш код будет работать, но я хочу что-то гибкое. Я достиг того, чего хотел, вы можете проверить это на отредактированном вопросе. – anirban

Смежные вопросы