Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有强制数组大小参数的Java方法?_Java_Class_Architecture - Fatal编程技术网

具有强制数组大小参数的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++)

我想为接受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++)
    {
        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中没有任何东西表明这些是必需的参数,但这并没有从构建器模式中带走任何东西。