#java #function #arguments
#java #функция #аргументы
Вопрос:
Мне нужна функция с большим количеством аргументов, поскольку:
private GroupLayout function(Container host, Class J1, String nameofJ1, Class J2, String nameofJ2,..................Class Jn, String nameofJn) {
//body
}
функция настраиваемого группового воспроизведения для использования в большем количестве приложений.
Я пытался:
private GroupLayout function(Container host, Class ...arg, String ...arg1) {
//body
}
but didn't work, it said "varargs parameter must be the last parameter, and with class are some problems.
например, я хотел бы вызвать функцию следующим образом:
функция (NamePanel, JButton, «xxx», JMenu, «yyy», JComboBox, «zzz») и предыдущее групповое отображение на NamePanel с JButton с именем «xxx», JMenu с именем «yyy» и так далее.
Есть кто-нибудь, кто знает решение этой проблемы?
Комментарии:
1. Ваш вариант использования слишком расплывчатый для конкретной справки, но звучит так, что, возможно, вы ищете
Map<Class, String>
.2. Речь идет только о вызове функции
3. Класс … аргументы и строка … arg1 оба являются аргументами переменной. У вас может быть только одна переменная arg, и она должна быть в конце списка параметров метода. Наличие такого количества аргументов в методе на самом деле является плохим дизайном, вам следует пересмотреть свое решение.
Ответ №1:
Переменные
Вы не можете использовать переменные более одного раза. Почему? Компилятор не будет знать, какие параметры вы передаете.
Смотрите пример использования String
только там, где компилятор первым параметром является a String
, а остальным (0..n) является vararg (скомпилированный в массив):
static void function(String arg, String ...arg1) { } // COMPILES
// this is perfectly valid, the first one is 'arg' and the rest is 'arg1'
function("1", "2", "3");
Эта функция с несколькими переменными значениями не работает, пока компилятор не знает, где arg1
заканчивается и arg2
начинается:
static void function(String arg, String ...arg1, String ...arg2) { } // DOESN'T COMPILE
// are both "2" and "3" an 'arg1' and 'arg2' is empty or different?
function("1", "2", "3");
По этой причине varargs должен быть всегда последним формальным параметром.
Обходной путь
Вы, кажется, хотите передать пару Class
и String
. Лучший способ передать эти пары — использовать структуру, основанную на ключе-значении Map<Class, String>
, которая также гарантирует одинаковое количество ключей и значений.
private GroupLayout function(Container host, Map<Class<?>, String> classStringMap) {
// method body
}
Map<Class<?>, String> map = new HashMap<>();
map.put(J1.class, "name of J1");
map.put(J2.class, "name of J2");
...
function(container, map);
Ответ №2:
Шаблон Builder — ваш друг.
Посмотрите также на аннотацию Lombok Builder.