У меня есть объект 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);
}
Детали класса логики прослезился от из-за безопасности.
'У меня есть объект, имеющий Item 4 строковых поля и 3 булевых поля. 'Итак, булевы являются полями вашего объекта, но вы хотите создать объект, зависит от его полей?Объект уже есть, не так ли? – Kent
Да, булевы являются частью объекта Item, который я хочу создать. В основном, 7 значений, которые я получаю из разных областей, но я создам этот объект Item только в том случае, если по крайней мере один из логических объектов, которые должны быть построены. Объект Item будет true. Это логическое значение также вычисляется после некоторой проверки, которую я получаю из COR (цепочки). – anirban
Report.buildReport() будет вызываться, если в enumSet есть хотя бы одно значение, т. Е. Существует одна логическая переменная true. в то же время, я могу добавить больше логического типа в перечисление InconsistencyReport, и для этого мне не нужно менять логику calculateInconsitencyReport(). Добавляйте только перечисление и создайте сеттер в BuildReport и создайте логическое значение в классе Report. – anirban