2009-06-01 61 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; 
    } 
}