具有强制数组大小参数的Java方法?
我想为接受3个参数的Java类创建一个初始化方法:具有强制数组大小参数的Java方法?,java,class,architecture,Java,Class,Architecture,我想为接受3个参数的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++)
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;
}
Employee[]方法(字符串[]employeeNames,整数[]employeeAges,浮点[]employeeSalaries)
{
员工myEmployees[]=新员工[尺码];//不知道尺码是多少
对于(int count=0;count
您可能会注意到此代码是错误的。未定义大小变量。我的问题是我想传入3个数组,但我想知道是否可以确保这三个数组都具有相同的数组大小。这样for循环就不会失败,因为for循环中的构造函数使用数组的所有参数
也许Java有一个不同的特性可以强制解决我的问题。我可以接受另一个名为SIZE的参数,该参数将在for循环中使用,但如果参数1和2的大小为10,而第三个参数是大小为9的数组,则这并不能解决我的问题
所以我只是想再说一遍,以防我不清楚。如何强制这3个参数都是包含完全相同数量元素的数组
使用一个指定数组大小的额外参数不是很优雅,也有点脏。它也不能解决数组参数包含不同大小数组的问题。您不能在编译时强制执行。基本上,您必须在执行时检查它,如果不满足约束,则抛出异常:
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");
}
...
}
由于传入的数组直到运行时才生成,因此根据作为编译时检查传入的数组的特征,无法阻止方法调用完成 正如Jon Skeet所提到的,指示问题的唯一方法是在运行时抛出
IllegalArgumentException
等,以在使用错误参数调用方法时停止处理
在任何情况下,文档都应该清楚地记录使用该方法的期望和“契约”——传入三个长度相同的数组。在Javadocs中为该方法指出这一点可能是个好主意。绕过该问题的一种方法是创建一个生成器,例如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;
}
}
公共类EmployeeArrayBuilder{
私有整数arraySize=null;
私有字符串[]employeeNames;
公共EmployeeArrayBuilder地址名(字符串[]employeeNames){
if(arraySize==null){
arraySize=employeeNames.length;
}else if(arraySize!=employeeNames.length){
抛出新的IllegalArgumentException(“employeeNames的长度需要为“+arraySize+”);
}
this.employeeNames=employeeNames;
归还这个;
}
公共员工薪酬体系构建者添加薪酬(浮动[]员工薪酬){/*与上述类似*/}
公共EmployeeArrayBuilder地址(整数[]employeeAges){/*相似*/}
公共雇员[]构建(){
//在这里,您可以在所讨论的构造函数中执行所需的操作,并确保成员的大小正确。
员工myEmployees[]=新员工[arraySize];//不知道大小
for(int count=0;count 这是一个很好的例子,我认为使用NulLoPoExtExchange的方法是错误的。如果(employeeNames==null){throw new IllegalArgumentException(“employeeNames==null”);}这会使stacktrace对诊断问题更有帮助。我认为在这种情况下抛出NPE也是可以接受的(但没有人会不同意抛出一个IAE);但作为这场辩论/争论中的一点折衷,最好在NPE中包含一条消息。我使用NullPointerException来遵循有效Java第二版第60项中所示的约定。为了真正正确地执行此操作,我会对每个参数使用单独的检查,以便输入正确的名称,但我希望保留co此示例的缩写:)与NullPointerException上的相同。引用javadoc,当应用程序试图在需要对象的情况下使用null时,将“抛出NullPointerException”。将“抛出IllegalArgumentException以指示已向方法传递非法或不适当的参数”。在这种情况下,null数组显然是非法参数。它没有被访问。我认为构建器在这里不合适,因为API中没有任何东西表明年龄、姓名和薪水都是必需的。当您可以有可选参数时,生成器是合适的。与Jon Skeet的答案相比,这也相当复杂。@Ken Liu:两者都解决了相同的问题-我发布了这篇文章,因为另一个解决方案已经发布了,为什么要重复?这是一个值得考虑的替代方案。事实上,API中没有任何东西表明这些是必需的参数,但这并没有从构建器模式中带走任何东西。