Ассоциативный массив Java как параметры метода - PullRequest
2 голосов
/ 14 марта 2011

Я заново изучаю Java после нескольких лет знакомства с PHP, и у меня возник вопрос о соглашении, используемом в PHP, и о том, как бы я достиг аналогичной цели в Java ...

PHP

function getReport( $options = array() ) {

}

в приведенной выше функции вы будете передавать необязательный ассоциативный массив параметров, которые могут выглядеть следующим образом

Array(
    from => "20110325",
    to   => "20110413",
    subject_id => "2432",
    ...etc...
);

И если аргумент не передан, он обрабатывается нормальнобез опций.

Ниже приведена моя попытка сформировать ту же функцию в Java, поскольку она строго типизирована (что в некоторых случаях довольно освежает). У меня возникают проблемы при создании такой же гибкости.Я подумал об использовании Dictionary, но не уверен, какой это будет "лучшая практика".

public TimeReport getTimeReport(Date from, Date to, int subjectId, int toDoItemId, int filterProjectId, int filterCompanyId) {

}

Чтобы вызвать это с помощью одного / двух / ни одного параметра, это становится довольно уродливым с аргументами ...

getTimeReport(null,null,null,234,null,null);

Ответы [ 3 ]

1 голос
/ 14 марта 2011

Этот тип гибкости не является встроенным в Java, и язык, на мой взгляд, не очень подходит для него.Вы можете проверить каждый входной аргумент;если ноль, установите его в значение по умолчанию.

Чтобы быть более общим / дидактическим, похоже, что вы пытаетесь создать какую-то Фабрику (к какому классу принадлежит метод getTimeReport ()?).Вместо этого вы хотите, чтобы конструктор TimeReport обрабатывал эти опции?Или сделать разные конструкторы TimeReport для разных обстоятельств?

1 голос
/ 14 марта 2011

Можете ли вы вызвать getTimeReport с другим объектом, который используется для представления параметров, необходимых для вызова функции getTimeReport?

Похоже, вы привыкли передавать строки в функции, когда вам может потребоваться передать объект.

0 голосов
/ 14 марта 2011

Обычно вы представляете класс, представляющий параметры конфигурации для генерации отчета, например TimeReportSpecification или что-то в этом роде.

Затем вы можете иметь статические фабричные методы, которые дают вам экземпляры TimeReportSpecification, например withToDoItem, так что вы получите:

getTimeReport(TimeReportSpecification.withToDoItem(234));
...