Аргументы функции

#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 — ваш друг.

Это реализация Java Builder.

Посмотрите также на аннотацию Lombok Builder.