Есть ли способ в 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 Вы планируете хранить.

Другие вопросы по тегам