Java关联数组作为方法的选项

Java关联数组作为方法的选项,java,php,associative-array,optional-parameters,Java,Php,Associative Array,Optional Parameters,在与PHP有了几年的关系后,我正在重新学习Java,我对PHP中使用的约定有一个问题,以及如何在Java中实现类似的目标 PHP 在上面的函数中,您将传入一个可选的选项关联数组,该数组可能如下所示 Array( from => "20110325", to => "20110413", subject_id => "2432", ...etc... ); 如果没有传递任何参数,它将处理得很好,没有任何选项 下面是我在java中构建相同函数的

在与PHP有了几年的关系后,我正在重新学习Java,我对PHP中使用的约定有一个问题,以及如何在Java中实现类似的目标

PHP

在上面的函数中,您将传入一个可选的选项关联数组,该数组可能如下所示

Array(
    from => "20110325",
    to   => "20110413",
    subject_id => "2432",
    ...etc...
);
如果没有传递任何参数,它将处理得很好,没有任何选项

下面是我在java中构建相同函数的尝试,因为它是强类型的(在某些情况下这是非常令人耳目一新的),我在构建相同的灵活性时遇到了困难。我曾考虑过使用
字典
,但不确定这是什么“最佳实践”

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

}
用一个/两个/无选项来调用它会变得非常难看,因为参数是

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

是否可以使用另一个对象调用getTimeReport,该对象用于表示调用getTimeReport函数所需的参数


当您可能希望传递对象时,您似乎习惯于向函数传递字符串。

通常,您会引入一个表示生成报告的配置参数的类,如
TimeReportSpecification
或其他

然后,您可以使用静态工厂方法,为您提供
TimeReportSpecification
的实例,如
withToDoItem
,因此您可以得到:

getTimeReport(TimeReportSpecification.withToDoItem(234));

这种灵活性不是Java内置的,在我看来,Java语言也不太适合这种灵活性。您可以检查每个输入参数;如果为null,则将其设置为默认值


更一般的/说教的是,您似乎正在尝试建立某种工厂(getTimeReport()方法属于哪个类?)。您想让TimeReport的构造函数处理这些选项吗?或者针对不同的情况生成不同的TimeReport构造函数?

您还可以传入两个单独的列表,两个列表的长度相同。或者一个单独的列表,其中每个元素都是一个对象,必须从subject_id etcI开始,就像它的标题一样,但是如果我想要
带ToDoItem
带Subjection
,你可以有一个
TimeReportSpecificationBuilder
,所以你可以使用
TimeReportSpecification.builder()。带ToDoItem(123).带Subjected(456).build())有关生成器模式信息,请参见。
getTimeReport(TimeReportSpecification.withToDoItem(234));