2009-06-01 62 views
5

我想爲接受3個參數的Java類創建一個初始化方法:具有強制數組大小參數的Java方法?

Employee[] method(String[] employeeNames, Integer[] employeeAges, float[] employeeSalaries) 
{ 
    Employee myEmployees[] = new Employee[SIZE];// dont know what size is 

    for (int count = 0; count < SIZE; count++) 
    { 
     myEmployees[count] = new Employee(employeeNames[count], employeeAges[count], employeeSalaries[count]); 
    } 
    return myEmployees; 
} 

您可能注意到,此代碼是錯誤的。沒有定義SIZE變量。我的問題是我想傳入3個數組,但是我想知道是否可以確保這三個數組都是相同的數組大小。這樣for循環將不會失敗,因爲for循環中的構造函數使用數組的所有參數。

也許Java有一個不同的功能,可以強制解決我的問題。我可以接受另一個稱爲SIZE的參數,它將在for循環中使用,但如果參數1和2的大小爲10,而第三個參數是大小爲9的數組,則不能解決我的問題。

重新審視我不清楚。我如何強制3個參數都是包含完全相同數量元素的數組?

使用額外的參數來指定數組大小不是很優雅和有點髒。它也不能解決數組參數包含不同大小數組的問題。

回答

16

你不能在編譯時強制執行該操作。你基本上都在執行時檢查,並拋出一個異常,如果約束不滿足:

Employee[] method(String[] employeeNames, 
        Integer[] employeeAges, 
        float[] employeeSalaries) 
{ 
    if (employeeNames == null 
     || employeeAges == null 
     || employeeSalaries == null) 
    { 
     throw new NullPointerException(); 
    } 
    int size = employeeNames.length; 
    if (employeesAges.length != size || employeeSalaries.length != size) 
    { 
     throw new IllegalArgumentException 
      ("Names/ages/salaries must be the same size"); 
    } 
    ... 
} 
+0

感謝喬恩,出色答卷! – 2009-06-01 09:03:15

+2

這是我認爲使用NullPointerException的錯誤方法的一個很好的例子。如果(employeeNames == null){ throw new IllegalArgumentException(「employeeNames == null」);我將對每個傳入的參數 進行單獨檢查。 } 這使得stacktrace更有助於診斷問題。 – 2009-06-01 10:03:44

2

由於直到運行時不會產生傳遞的陣列,它是不可能防止方法根據作爲編譯時檢查傳入的數組的特性完成調用。

正如Jon Skeet所提到的,指出問題的唯一方法是在運行時拋出IllegalArgumentException或類似的東西,以便在錯誤的參數調用方法時停止處理。

在任何情況下,文檔都應該清楚地注意期望和使用該方法的「合同」 - 傳入三個長度相同的數組。在Javadocs中記錄這個方法可能是個好主意。

0

裙子解決該問題的方法是創建一個建設者,例如,EmployeeArrayBuilder,

public class EmployeeArrayBuilder { 
    private Integer arraySize = null; 
    private String[] employeeNames; 
    public EmployeeArrayBuilder addName(String[] employeeNames) { 
     if (arraySize == null) { 
     arraySize = employeeNames.length; 
     } else if (arraySize != employeeNames.length) { 
     throw new IllegalArgumentException("employeeNames needs to be " + arraySize + " in length"); 
     } 
     this.employeeNames = employeeNames; 
     return this; 
    } 
    public EmployeeArrayBuilder addSalaries(float[] employeeSalaries) {/* similar to above */} 
    public EmployeeArrayBuilder addAges(Integer[] employeeAges) {/* similar */} 
    public Employee[] build() { 
     // here, you can do what you needed to do in the constructor in question, and be sure that the members are correctly sized. 
     Employee myEmployees[] = new Employee[arraySize ];// dont know what size is    
     for (int count = 0; count < arraySize ; count++) { 
      myEmployees[count] = new Employee(employeeNames[count], employeeAges[count], employeeSalaries[count]); 
     } 
     return myEmployees; 
    } 
}