Список параметров переменной Java
Кода -копия выглядит следующим образом:
класс A {}
Поскольку все классы унаследованы от объекта, вы можете использовать массив объектов в качестве параметра:
Public Class Parameter {static void printarray (Object [] args) {for (Object obj: args) {System.out.print (obj + ""); } System.out.println (); } public static void main (string [] args) {printarray (new Object [] {new Integer (47), New Float (3.14), New Double (11.11)}); printarray (новый объект [] {"one", "два", "там"}); printarray (новый объект [] {new a (), new a (), new a ()}); }} Для версий Java SE5 после добавления функций вы можете написать это:
Public Class Parameter {public static void printarray (объект ... args) {for (Object obj: args) {System.out.print (obj + ""); } System.out.println (); } public static void main (string [] args) {princarray (новый целый integer (47), new float (3.14), new Double (11.11)); princarray (47, 3.14f, 11.11); princarray («One», «два», «три»); princarray (new a (), new a (), new a ()); printarray ((Object []) New Integer [] {1, 2, 3, 4}); printarray (); }} Вы можете использовать объект, чтобы подумать о списке параметров:
открытый класс varargtype {static void f (символ ... args) {System.out.print (args.getClass ()); System.out.println ("длина" + args.length); } static void g (int ... args) {System.out.print (args.getClass ()); System.out.println ("длина" + args.length); } public static void main (string [] args) {f ('a'); f (); G (1); g (); System.out.println ("int []" + new int [0] .getClass ()); }}Это функция, представленная в Java 5. Если количество параметров, которые хочет получить метод, неясно, то эта функция может пригодиться.
Например, в тех случаях, когда участвуют операции ввода -вывода, вам в основном нужно закрыть как минимум два потока: вход и вывод. Мне нравится инкапсулировать операцию закрытия потока в следующий метод, чтобы несколько потоков могли быть закрыты только одним вызовом.
public static void closeSilent (closable ... closeables) {for (closable stecable: roloceables) {if (closable! = null) {try {closable.close (); } catch (ioException игнорируется) {}}}}Это единственное место, я думаю, что эта функция подходит для использования, со следующими функциями:
Эти параметры имеют одинаковый тип;
Количество параметров неясно, каждый не является обязательным;
Использование этих параметров одинакова, например, приведенное выше выполняется закрытие.
Список параметров переменной длины Java может быть размещен только в конце списка параметров метода.
Реализация списка параметров переменной длины Java
Реализация списка параметров переменной длины Java передается через компилятор, чтобы инкапсулировать эти параметры в массив.
Например, подпись приведенного выше метода на самом деле: закрыть (ближайшие [] близкие) пустоты.
Наступить на яму
Есть метод, который называется A и B в двух местах. В сентябре необходимо добавить параметр к A. Когда мой разум был сумасшедшим, я решил использовать список параметров переменной длины. Я чувствовал, что не нужно менять его на B, поэтому яма была похоронена.
Недавно мы попросили B добавить здесь два новых параметра, поэтому мы продолжаем добавлять параметры в список параметров метода. Типы этих параметров различны, поэтому список параметров переменной длины объявляется как тип объекта.
Первая яма состоит в том, что при принятии элементов с параметрами переменной длины в этом методе она не учитывает, что некоторые параметры не передаются, а массив является офсайдом исключением непосредственно. Я сразу почувствовал, что список параметров переменной длины не был хорошим, поэтому он не нуждался в нем, и изменил его на регулярное прохождение параметров фиксированной формы.
После модификации можно проверить его в тестовой среде. После замены нескольких классов в производственной среде результатом является ошибка. Метод не может быть найден. Это зависит от подписи метода, но это массив, и он не был заменен. Судя по исходному коду, местоположение вызова не нужно изменять, поэтому я не ожидал заменить его; Поскольку тестовая среда полностью упакована, проблем не будет.
Подпись метода определяется во время компиляции. Уровень исходного кода, по -видимому, не требует модификации, но не означает, что скомпилированный класс не нужно заменять.
Фактически, я слышал до этого в этом случае нерегулярных пакетов, после изменения постоянного значения в исходном коде, заменяется только файл класса, который определяет константу, и невозможно перекомпилировать и заменить все файлы класса, которые ссылаются на эту константу, что приводит к необъяснимым задачам. По сути, это та же проблема, что и подпись метода.