Есть ли способ в Java передать несколько пар параметров в метод?
Довольно новый для Java
Я хотел бы иметь возможность использовать метод следующим образом;
class PairedData {
String label;
Object val:
}
public void myMethod(String tablename, PairedData ... pD) {
/*
insert a record into a table -tablename with the various fields being
populated according to the information provided by the list of
PairedData objects
*/
}
myMethod("firststring",{"field1",Date1},{"field2",12},{"field3","aString"});
Я понимаю, что синтаксис недействителен, но я надеюсь, что он дает суть того, что я хотел бы сделать.
То, что я пытаюсь сделать, - это напрямую передавать данные, а не заполнять экземпляры класса, а затем передавать их. Это возможно, или я просто пытаюсь нарушить множество правил ООП?
4 ответа
Нет, то, что вы пытаетесь сделать, на самом деле невозможно. Мне кажется, что было бы намного лучше передавать экземпляры вашего класса методу, а не делать что-то замысловатое с такими массивами. Другой ответ предложил использовать Object[]
Параметр varargs - это, вероятно, самое близкое к достижению чего-то похожего на то, что вы показываете в своем примере. Другой вариант (и я думаю, что лучше) будет
public void myMethod(String tablename, String[] labels, Object[] vals) {
Вы можете создать свой класс для каждого labels[i]
а также vals[i]
(объединяя их) в этих массивах. Другими словами, в вашем методе вы могли бы иметь что-то вроде
pD = new PairedData[labels.length];
for (i = 0; i < labels.length; i++)
pD[i] = new PairedData(labels[i], vals[i]); // assuming you
// added this
// constructor
Пример вызова метода, который вы включили, будет преобразован в
myMethod("firststring", new String[]{"field1", "field2", "field3"},
new Object[]{date1, 12, "aString"});
Вы можете сделать это, используя массивы Object:
public void myMethod(String tableName, Object[] ...pairs)
и вызвать этот метод в таком стиле:
myMethod("someTable", new Object[] {"field1", date1}, new Object[] {"field2", date2});
Обычно...
Вы бы сделали класс, который имеет переменную для всех параметров. тогда вы создадите экземпляр этого класса и заполните значения.
тогда вы можете использовать этот экземпляр класса, чтобы передать их.
если вам нужна целая куча... тогда создайте коллекцию (Map, HashMap, List и т. д.) и передайте ее.
Кажется, это хороший случай для будущего расширения языка, если вы спросите меня. Но, слегка изменив способ вызова метода, мы сможем приблизиться...
myMethod("someTable",
new PairedData("field1", date1),
new PairedData("field2", date2)
);
Это более типичная работа, но она, вероятно, самая безопасная, так как она безопасна для типов и не подвержена ошибкам при сопоставлении пар.
Вам также потребуется написать свой конструктор для "PairedData(String label, Object val)", для которого я советую написать несколько перегруженных версий, по одной для каждого типа val
Вы планируете хранить.