Метод Java с параметрами принудительного размера массива? - PullRequest
5 голосов
/ 01 июня 2009

Я хотел бы создать метод инициализации для класса Java, который принимает 3 параметра:

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 аргумента были массивами, которые содержат одинаковое количество элементов?

Использование дополнительного параметра, который определяет размеры массива, не очень элегантно и немного грязно. Это также не решает проблему, когда параметры массива содержат массивы разных размеров.

Ответы [ 3 ]

17 голосов
/ 01 июня 2009

Вы не можете применить это во время компиляции. Вы в основном должны проверить это во время выполнения и выдать исключение, если ограничение не выполнено:

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");
    }
    ...
}
2 голосов
/ 01 июня 2009

Поскольку передаваемые массивы не генерируются до времени выполнения, невозможно предотвратить завершение вызова метода в зависимости от характеристик массива, передаваемого как проверка во время компиляции.

Как упоминал Джон Скит, единственный способ указать на проблему - бросить IllegalArgumentException или подобное во время выполнения, чтобы остановить обработку, когда метод вызывается с неправильными параметрами.

В любом случае в документации должны быть четко указаны ожидания и «контракт» для использования метода - передача трех массивов одинаковой длины. Вероятно, было бы неплохо отметить это в Javadocs для метода.

1 голос
/ 01 июня 2009

Чтобы обойти проблему, нужно создать построитель, например, 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;
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...