2011-03-14 24 views
1

我與PHP有多年的事務後重新學習Java,並且我有一個關於在PHP中使用的約定的問題,以及我如何在Java中實現類似的目標。 。作爲方法的選項的Java關聯數組

PHP

function getReport($options = array()) { 

} 

中你會傳遞的,可能看起來像這樣

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

如果沒有參數PA選項可選的關聯數組上述功能它沒有選擇就可以很好地處理。

下面是我嘗試在java中形成相同的功能,因爲它是強類型的(這在某些情況下非常令人耳目一新),我在構建相同的靈活性時遇到了問題。我曾考慮過使用Dictionary,但不確定如何「最佳做法」。

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

} 

要使用它得到的論據是很醜陋一/二/無選項調用此...

getTimeReport(null,null,null,234,null,null); 
+0

您也可以傳入兩個單獨的列表,這兩個列表具有相同的長度。或者一個單一的列表,每個元素都是一個對象,必須來自subject_id等。 – LazyCubicleMonkey 2011-03-14 04:22:47

回答

1

可以調用getTimeReport與用來表示需要的參數另一個對象調用getTimeReport函數?

看起來像你習慣於將字符串傳遞給函數,當你想傳遞一個對象時。

0

通常你會介紹一個代表報表生成的配置參數的類,如TimeReportSpecification或其他。

然後,您可以有靜態的工廠方法,讓你TimeReportSpecification的情況下,像withToDoItem,讓您得到:

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

我喜歡這裏的目標,但如果我想'withToDoItem'和'withSubjectId'? – jondavidjohn 2011-03-14 04:25:54

+0

你可以有'TimeReportSpecificationBuilder',所以你可以使用'TimeReportSpecification.builder()。withToDoItem(123).withSubjectId(456).build());' 請參閱http://rwhansen.blogspot.com/2007/ 07/theres-builder-pattern-that-joshua.html用於構建器模式信息。 – sjr 2011-03-14 04:30:53

1

這種靈活性是沒有內置到Java,語言不在我看來非常適合它。你可以檢查每個輸入參數;如果爲null,則將其設置爲默認值。

爲了更一般/教誨,它看起來像你正在嘗試某種類型的工廠(getTimeReport()方法屬於哪個類?)。你是否想讓TimeReport的構造函數處理這些選項?或者針對不同的情況製作不同的TimeReport構造函數?