【问题标题】:Java Associative Array as Options for MethodJava 关联数组作为方法的选项
【发布时间】:2011-07-14 18:14:05
【问题描述】:

在与 PHP 接触多年后,我正在重新学习 Java,我对 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);

【问题讨论】:

  • 你也可以传入两个单独的列表,它们的长度相同。或者一个列表,每个元素都是一个对象,必须来自、从、subject_id 等

标签: java php associative-array optional-parameters


【解决方案1】:

你可以用另一个对象来调用getTimeReport吗?这个对象用来表示调用getTimeReport函数所需的参数?

当您可能想要传递对象时,您似乎习惯于将字符串传递给函数。

【讨论】:

    【解决方案2】:

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

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

    getTimeReport(TimeReportSpecification.withToDoItem(234));
    

    【讨论】:

    • 我喜欢它的发展方向,但如果我想要withToDoItem AND withSubjectId 怎么办?
    • 您可以拥有TimeReportSpecificationBuilder,因此您可以使用TimeReportSpecification.builder().withToDoItem(123).withSubjectId(456).build());,有关构建器模式信息,请参阅rwhansen.blogspot.com/2007/07/…
    【解决方案3】:

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

    为了更笼统/说教,看起来您正在尝试拥有某种类型的工厂(getTimeReport() 方法属于哪个类?)。您是否希望让 TimeReport 的构造函数处理这些选项?还是针对不同的情况制作不同的TimeReport构造函数?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-28
      • 1970-01-01
      • 2011-07-04
      • 2016-07-03
      • 2012-07-10
      • 1970-01-01
      • 2015-11-03
      • 2021-08-14
      相关资源
      最近更新 更多